home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* WINDGAME.PAS *)
- (* Windgeschwindigkeit und Windrichtung *)
- (* messen mit der Gamekarte *)
- (* für Hercules und VGA *)
- (* (c) 1991 Andreas Bartels & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM WindGame;
-
- USES Crt, Dos, Graph;
-
- VAR
- Anfang : BOOLEAN;
- Xa, Ya, Beaufort : WORD;
- GraphDriver, GraphMode,
- X0, Y0, XOff, YOff,
- i, NMittelung : INTEGER;
- MaxNord, MaxOst,
- TanAlphaY, TanAlphaX,
- Alpha, RKugel, YFak,
- KugelFlaeche, KugelMasse,
- Temperatur, LuftDruck,
- RelFeuchte, LuftDichte,
- GPX, GPY, AlphaX, AlphaY,
- VX, VY, VXAlt, VYAlt, V,
- Richtung, OffX, OffY, cw, g,
- FaktX, FaktY, V_aus_Alpha : REAL;
- HStr : STRING[10];
-
- CONST
- DaumenNS : REAL = 0.0; { Daumenfaktor Nord-Süd-Richtung }
- DaumenWO : REAL = 0.0; { Daumenfaktor Ost-West-Richtung }
- { diese Konstanten sind hardwareabhängig und müssen auf }
- { jedem Rechner individuell gesetzt werden! }
-
- FUNCTION GamePort(Kanal : BYTE;
- Offset : INTEGER) : INTEGER;
- { Kanal: 0/1/2/3 = 1X/1Y/2X/2Y = SelectBit: 1/2/4/8 }
- CONST
- MaxZaehler = 2000;
- PortNr = $201;
- VAR
- SelectBit : BYTE;
- GPWert, Zaehler : INTEGER;
- BEGIN
- INLINE($FA); { Interrupts sperren }
- SelectBit := 1 SHL Kanal;
- Zaehler := 0;
- REPEAT
- GPWert := Port[PortNr];
- Inc(Zaehler);
- UNTIL (GPWert AND SelectBit = 0)
- OR (Zaehler >= MaxZaehler);
- Port[PortNr] := GPWert;
- Zaehler := Offset;
- REPEAT
- GPWert := Port[PortNr];
- Inc(Zaehler);
- UNTIL (GPWert AND SelectBit = 0)
- OR (Zaehler >= MaxZaehler);
- GamePort := Zaehler;
- INLINE($FB); { Interrupts zulassen }
- END; { GamePort }
-
- BEGIN
- { Festlegung der mechanischen Werte }
- RKugel := 0.032; { Radius [m] }
- KugelMasse := 0.050; { Kugel-Masse [kg] }
- KugelFlaeche := Pi * Sqr(RKugel); { Kugelfläche [m²] }
- cw := 0.33; { Luftwiderstandsbeiwert }
- g := 9.81; { Erdbeschleunigung [m/s²] }
- Temperatur := 20.00; { auch meßbar [°C] }
- LuftDruck := 101.30; { [KPa] }
- RelFeuchte := 70.00; { rel. LuftFeuchte [%] }
- LuftDichte := 1.188 + 0.012 * (LuftDruck - 100) -
- 0.004*(Temperatur-20); { Näherung! }
- VXAlt := 0; { [m/s] }
- VYAlt := 0; { [m/s] }
- X0 := 164; { Windrosen-Mitte }
- Y0 := 163; { Windrosen-Mitte }
- MaxNord := 32; { Winkel zur Eichung [°] }
- MaxOst := 35; { Winkel zur Eichung [°] }
- NMittelung := 20; { Anzahl der Mittelungen }
- V_aus_Alpha := (2 * KugelMasse * g) /
- (LuftDichte * cw * KugelFlaeche);
- Anfang := TRUE;
- ClrScr;
- WriteLn('WindGame' +
- ' Windmessung am Gameport' +
- ' (c) 1991 Andreas Bartels & toolbox');
- WriteLn;
- WriteLn('Bitte Meßwerk in Neutralstellung bringen ' +
- 'und <Return> drücken');
- ReadLn;
- XOff := -GamePort(0, 0);
- YOff := -GamePort(1, 0);
- WriteLn('Bitte Meßwerk auf Endstellung Nord ' +
- 'stellen und <Return> drücken.');
- ReadLn;
- FaktY := -MaxNord * Pi / 180 / GamePort(1, YOff);
- WriteLn('Bitte Meßwerk auf Endstellung Ost ' +
- 'stellen und <Return> drücken.');
- ReadLn;
- FaktX := MaxOst * Pi / 180 / GamePort(0, XOff);
- WriteLn(' XOff : ', XOff:4, ' YOff : ', YOff:4,
- ' FaktX : ', FaktX:7:5,
- ' FaktY : ', FaktY:7:5, ' > <Return> drücken');
- ReadLn;
- GraphDriver := Detect;
- InitGraph(GraphDriver, GraphMode, GetEnv('BGIPATH'));
- { Pfad zu den BGI-Treibern mit "SET BGIPATH=..." setzen! }
- GetAspectRatio(Xa, Ya);
- YFak := Xa / Ya;
- X0 := 164;
- Y0 := 163;
- OutTextXY(15, 7, 'WINDGAME: Windmessung am Gameport' +
- ' (c) 1991 Andreas Bartels & toolbox');
- Rectangle(0, 0, 639, 347);
- Rectangle(0, 0, 639, 20);
- Rectangle(331, 20, 639, 347);
- SetViewPort(350, 30, 620, 347, TRUE);
- OutTextXY(0, 20, ' Luft ');
- OutTextXY(0, 50, 'Temperatur : °C ');
- OutTextXY(0, 70, 'Druck : KPa ');
- OutTextXY(0, 90, 'Feuchtigkeit : % rel.');
- OutTextXY(0, 110, '=> Dichte : kg/m^3');
- OutTextXY(0, 170, ' Wind ');
- OutTextXY(0, 200, 'Geschwindigkeit : m /s ');
- OutTextXY(0, 220, ' = Km/h ');
- OutTextXY(0, 240, 'Windstärke (Beaufort): ');
- OutTextXY(0, 260, 'in Richtung : Grad ');
- { Windrosen-Anzeige aufbauen }
- SetViewPort(1, 21, 330, 346, TRUE);
- Circle(X0, Y0, 5);
- FOR i := 1 TO 3 DO
- Circle(X0, Y0, i*50);
- FOR i := 0 TO 8 DO
- Line(X0 + Round(144 * Cos(i * Pi / 4)),
- Y0 + Round(144 * YFak * Sin(i * Pi / 4)),
- X0 + Round(150 * Cos(i * Pi / 4)),
- Y0 + Round(150 * YFak * Sin(i * Pi / 4)));
- FOR i := 0 TO 72 DO
- Line(X0 + Round(148 * Cos(i * Pi / 36)),
- Y0 + Round(148 * YFak * Sin(i * Pi / 36)),
- X0 + Round(150 * Cos(i * Pi / 36)),
- Y0 + Round(150 * YFak * Sin(i * Pi / 36)));
- OutTextXY(X0 - 3, Y0 - Trunc(159 * YFak), 'N');
- OutTextXY(X0 + 154, Y0 - 3, 'O');
- OutTextXY(X0 - 3, Y0 + Trunc(154 * YFak), 'S');
- OutTextXY(X0 - 159, Y0 - 3, 'W');
- SetWriteMode(XORPut);
- SetColor(GetMaxColor);
- REPEAT { Windmessung bis Tastendruck }
- GPX := 0;
- GPY := 0; { gemittelte Werte bilden }
- FOR i := 1 TO NMittelung DO BEGIN
- GPX := GPX + GamePort(0, XOff);
- GPY := GPY + GamePort(1, YOff);
- END;
- GPX := GPX / NMittelung + DaumenWO;
- GPY := GPY / NMittelung + DaumenNS;
- AlphaX := FaktX * GPX; { Umrechnung Widerstand }
- AlphaY := FaktY * GPY; { in Winkel }
- { Umrechnung Winkel in Windrichtung und -geschwindigkeit }
- { Sonderfälle : irgendwelche Winkel = 0 }
- IF (AlphaX = 0) AND (AlphaY = 0) THEN BEGIN
- Richtung := -0.5 * Pi;
- Alpha := 0;
- V := 0;
- END ELSE
- IF AlphaX = 0 THEN BEGIN
- Richtung := -0.5 * Pi;
- IF AlphaY > 0 THEN
- Richtung := 0.5 * Pi;
- Alpha := -AlphaY;
- IF AlphaY > 0 THEN
- Alpha := AlphaY
- END
- ELSE
- IF AlphaY = 0 THEN BEGIN
- Richtung := 0;
- Alpha := AlphaX;
- END
- ELSE BEGIN { Normalfall }
- TanAlphaY := Sin(AlphaY) / Cos(AlphaY);
- TanAlphaX := Sin(AlphaX) / Cos(AlphaX);
- Richtung := ArcTan(TanAlphaY / TanAlphaX);
- Alpha := ArcTan(TanAlphaX / Cos(Richtung));
- END;
- IF Alpha <> 0 THEN
- V := Sqrt(Abs(Sin(Alpha) * V_aus_Alpha)) *
- Alpha/Abs(Alpha);
- VX := V * Cos(Richtung);
- VY := V * Sin(Richtung);
- Richtung := 90 + 180 / Pi * Richtung; { in Grad }
- IF VX < 0 THEN
- Richtung := Richtung + 180;
- IF Richtung = 360 THEN
- Richtung := 0;
- V := Abs(V);
- { Berechnung der Windstärke nach Beaufort }
- CASE Round(V * 10) OF
- 0..3 : Beaufort := 0;
- 4..16 : Beaufort := 1;
- 17..34 : Beaufort := 2;
- 35..55 : Beaufort := 3;
- 56..80 : Beaufort := 4;
- 81..108 : Beaufort := 5;
- 109..139 : Beaufort := 6;
- 140..172 : Beaufort := 7;
- 173..208 : Beaufort := 8;
- 209..245 : Beaufort := 9;
- 246..285 : Beaufort := 10;
- 286..326 : Beaufort := 11;
- ELSE
- Beaufort := 12;
- END;
- { Konstanten, die auch als Variablen meßbar sind }
- IF Anfang THEN BEGIN
- SetViewPort(515, 30, 560, 220, TRUE);
- ClearViewPort;
- Str(Temperatur:5:2, HStr);
- OutTextXY(0, 50, HStr);
- Str(LuftDruck:5:1, HStr);
- OutTextXY(0, 70, HStr);
- Str(RelFeuchte:5:2, HStr);
- OutTextXY(0, 90, HStr);
- Str(LuftDichte:5:3, HStr);
- OutTextXY(0, 110, HStr);
- END;
- { Geschwindigkeit und Richtung }
- IF (VXAlt <> VX) OR (VYAlt <> VY) THEN BEGIN
- SetViewPort(515, 230, 560, 320, TRUE);
- ClearViewPort;
- Str(V:5:0, HStr);
- OutTextXY(0, 0, HStr);
- Str((V * 3.6):5:0, HStr);
- OutTextXY(0, 20, HStr);
- Str(Beaufort:5, HStr);
- OutTextXY(0, 40, HStr);
- Str(Richtung:5:0, HStr);
- OutTextXY(0, 60, HStr);
- GPX := GPX + GamePort(0, XOff);
- GPY := GPY + GamePort(1, YOff);
- SetViewPort(1, 21, 330, 346, TRUE);
- IF NOT Anfang THEN BEGIN { alten Pfeil löschen }
- MoveTo(X0 + Round(3.6 * VXAlt),
- Y0 + Round(3.6 * YFak * VYAlt));
- LineTo(X0, Y0);
- END;
- MoveTo(X0 + Round(3.6 * VX),{ neuen Pfeil zeichnen }
- Y0 + Round(3.6 * YFak * VY));
- LineTo(X0, Y0);
- Anfang := FALSE;
- END;
- VXAlt := VX;
- VYAlt := VY;
- UNTIL KeyPressed;
- CloseGraph;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von WINDGAME.PAS *)
-
-