home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1990
/
11
/
dtp
/
bezanim.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1990-10-04
|
9KB
|
326 lines
(* ------------------------------------------------------ *)
(* BEZANIM.PAS *)
(* Animiertes Demo zur Demonstration der Unit BEZIER.PAS *)
(* Turbo Pascal 5.0 und 5.5 *)
(* (c) 1990 TOOLBOX *)
(* ------------------------------------------------------ *)
{$B-,D-,E-,F+,I-,L-,N-,O-,R-,S-,V-}
{$M 16384,0,655360}
PROGRAM BezDemo;
USES Graph, Crt, Bezier, txKeys;
CONST BGIPath = '';
CursorOK : BOOLEAN = TRUE;
AnzKurven = 100;
PunktePerKurve = 300;
TYPE LineType = ARRAY[1..PunktePerKurve] OF PointType;
LinePointer = ^LineType;
VAR i : WORD;
GD, GM, AnzPunkte : INTEGER;
Punkte : BezPoints;
x, y, MaxY : INTEGER;
DemoLineColor,
StartColor,
StuetzColor,
BezierColor : WORD;
Taste : KeyRec;
Kurve : ARRAY[1..AnzKurven] OF LinePointer;
KurveNr,
KurveIndex : WORD;
PROCEDURE InitGrafik;
BEGIN
DetectGraph(GD, GM);
CASE GD OF
MCGA,
CGA: BEGIN
GM := CGAC0;
StartColor := 3;
StuetzColor := 2;
BezierColor := 1;
DemoLineColor := 2;
END;
EGA,
EGA64,
VGA: BEGIN
StartColor := Yellow;
StuetzColor := LightRed;
BezierColor := LightGreen;
DemoLineColor := Green;
END;
HercMono:
BEGIN
StartColor := 1;
StuetzColor := 1;
BezierColor := 1;
DemoLineColor := 1;
END;
END;
InitGraph(GD, GM, BGIPath);
SetTextStyle(DefaultFont, HorizDir, 1);
SetTextJustify(CenterText, TopText);
MaxY:=GetMaxY - 3 * TextHeight('X');
SetColor(BezierColor);
Rectangle(0, 0, GetMaxX, MaxY);
Rectangle(0, MaxY, GetMaxX, GetMaxY);
SetViewPort(1, 1, GetMaxX-1, MaxY-1, TRUE);
END;
PROCEDURE CloseGrafik;
BEGIN
CloseGraph;
END;
PROCEDURE SpeicherePunkte(x, y : BezRealTyp); { Linie ziehen }
BEGIN
Inc(KurveIndex);
Kurve[KurveNr]^[KurveIndex].x := Round(x);
Kurve[KurveNr]^[KurveIndex].y := Round(y);
WITH BezDat^ DO BEGIN
LastPoint.x := x;
LastPoint.y := y;
END;
END;
PROCEDURE Schrift(Zeile1, Zeile2: STRING);
{ schreibt Text am unteren Bildschirmrand }
BEGIN
SetViewPort(1, MaxY+1, GetMaxX-1, GetMaxY-1, ClipOn);
ClearViewPort;
SetColor(StartColor);
OutTextXY(GetMaxX DIV 2, 1, Zeile1);
OutTextXY(GetMaxX DIV 2,
3*TextHeight('X') DIV 2+1, Zeile2);
SetViewPort(1, 1, GetMaxX-1, MaxY-1, ClipOn);
END;
PROCEDURE Add(VAR Source: INTEGER; Min, Max: INTEGER;
Step: SHORTINT; Wrap: BOOLEAN);
{ Add erhöht oder erniedrigt die als "Source" übergebene
Variable. Min und Max sind die erlaubten Grenzen, Wrap
schaltet das Wrapping bei Über- und Unterschreitung
der zulässigen Minimal- oder Maximalwerte ein und aus }
VAR
WrapNoetig : BOOLEAN;
SourceAlt : BYTE;
BEGIN
WrapNoetig := (Source+Step > Max) OR (Source+Step < Min);
CASE WrapNoetig OF
TRUE: IF Wrap THEN
IF Step > 0 THEN
Source := Min
ELSE
Source := Max
ELSE
IF Step > 0 THEN
Source := Max
ELSE
Source := Min;
FALSE: Inc(Source, Step);
END;
END;
PROCEDURE Cursor(VAR x, y: INTEGER; VAR OK: BOOLEAN);
{ Fadenkreuz-Cursor; übergibt die
Bildschirm-Koordinaten in den Variablen x und y }
VAR
ch : CHAR;
XAlt, YAlt : INTEGER;
CONST
Step: BYTE = 2;
PROCEDURE Draw; { zeichnet den Cursor }
BEGIN
Line(0, y, GetMaxX, y);
Line(x, 0, x, MaxY);
END;
BEGIN
XAlt:=x; { Original-Koordinaten sichern }
YAlt:=y;
SetWriteMode(XORPut);
SetColor(BezierColor);
REPEAT
Draw;
ScanKey(Taste);
Draw;
CASE Taste.Typ OF
KeyLinks : Add(x, 0, GetMaxX, -Step, TRUE);
KeyRechts : Add(x, 0, GetMaxX, Step, TRUE);
KeyOben : Add(y, 0, MaxY, -Step, TRUE);
KeyUnten : Add(y, 0, MaxY, Step, TRUE);
KeySpace : IF Step = 2 THEN { Schrittweite ändern }
Step := 15
ELSE
Step := 2;
END;
UNTIL Taste.Typ IN [KeyReturn, KeyEsc];
OK := (Taste.Typ = KeyReturn);
IF NOT OK THEN BEGIN { Mit <Esc> verlassen: }
x:=XAlt; { Original-Koordinaten restaurieren }
y:=YAlt;
END;
SetWriteMode(CopyPut);
END;
PROCEDURE ShowPoint(x, y : INTEGER; Color: WORD);
{ zeichnet die Markierungen für die Punkte }
BEGIN
SetColor(Color);
Circle(Round(x), Round(y), 6);
PutPixel(Round(x), Round(y), Color);
END;
PROCEDURE GetPoint(VAR x, y: INTEGER; Index, Color: WORD);
{ Eingabe der einzelnen Punkte mittels Fadenkreuzcursor }
CONST
OK: BOOLEAN = FALSE;
BEGIN
REPEAT
Cursor(x, y, OK);
IF NOT OK THEN { Abbruch durch <ESC> }
CloseGrafik;
UNTIL OK;
ShowPoint(x, y, Color);
Punkte[Index].x := x;
Punkte[Index].y := y;
END;
PROCEDURE MakeMovie; { Prozedur erzeugt "Film" }
VAR
Index : INTEGER;
Winkel,
SinW,
CosW : REAL;
CONST
Step : BYTE = 5;
BEGIN
Index:=2;
FOR KurveNr:=1 TO AnzKurven DO
BEGIN
Winkel:=KurveNr*2*Pi/AnzKurven;
SinW := Sin(Winkel);
CosW := Cos(Winkel);
BezDat^.TempPoints^[1]^[1].x := Punkte[1].x;
BezDat^.TempPoints^[1]^[1].y := Punkte[1].y;
BezDat^.TempPoints^[1]^[AnzPunkte].x := Punkte[AnzPunkte].x;
BezDat^.TempPoints^[1]^[AnzPunkte].y := Punkte[AnzPunkte].y;
FOR Index := 1 TO AnzPunkte DO
IF Odd(Index) THEN BEGIN
BezDat^.TempPoints^[1]^[Index].x := GetMaxX DIV 2 + (Punkte[Index].x - GetMaxX DIV 2) * SinW;
BezDat^.TempPoints^[1]^[Index].y := GetMaxY DIV 2 + (Punkte[Index].y - GetMaxY DIV 2) * CosW;
END ELSE BEGIN
BezDat^.TempPoints^[1]^[Index].x := GetMaxX DIV 2 + (Punkte[Index].x - GetMaxX DIV 2) * CosW;
BezDat^.TempPoints^[1]^[Index].y := GetMaxY DIV 2 + (Punkte[Index].y - GetMaxY DIV 2) * SinW;
END;
KurveIndex := 0;
BezDoBeziere;
END;
END;
PROCEDURE ShowMovie;
VAR
AlteKurve: WORD;
PROCEDURE DrawKurve(KurveNr, KurveAlt: WORD);
VAR
Index: WORD;
xa, ya, xn, yn: INTEGER;
BEGIN
xn := Kurve[KurveNr]^[1].x;
yn := Kurve[KurveNr]^[1].y;
IF KurveAlt>0 THEN BEGIN
xa := Kurve[KurveAlt]^[1].x;
ya := Kurve[KurveAlt]^[1].y;
END;
MoveTo(Kurve[KurveNr]^[1].x, Kurve[KurveNr]^[1].y);
FOR Index:=2 TO PunktePerKurve DO
BEGIN
IF (KurveAlt > 0) AND (Kurve[KurveAlt]^[Index].x > -1) THEN BEGIN
SetColor(0);
MoveTo(xa, ya);
LineTo(Kurve[KurveAlt]^[Index].x, Kurve[KurveAlt]^[Index].y);
xa := GetX;
ya := GetY;
END;
IF Kurve[KurveNr]^[Index].x > -1 THEN BEGIN
SetColor(BezierColor);
MoveTo(xn, yn);
LineTo(Kurve[KurveNr]^[Index].x, Kurve[KurveNr]^[Index].y);
xn := GetX;
yn := GetY;
END;
END;
END;
BEGIN
ClearDevice;
AlteKurve := 0;
REPEAT
FOR KurveNr := 1 TO AnzKurven DO
BEGIN
DrawKurve(KurveNr, AlteKurve);
AlteKurve:=KurveNr;
IF KeyPressed THEN
IF ReadKey=#27 THEN
EXIT;
END;
UNTIL FALSE;
END;
BEGIN
BezMaxIt := 4;
FOR KurveNr := 1 TO AnzKurven DO BEGIN
New(Kurve[KurveNr]);
FOR KurveIndex := 1 TO PunktePerKurve DO BEGIN
Kurve[KurveNr]^[KurveIndex].x := -1;
END;
END;
ClrScr;
HighVideo;
Writeln(^J, 'toolbox Bézier-Demonstration');
Writeln('============================', ^J^J);
LowVideo;
Writeln('Geben Sie bitte Sie bitte '+
'die Anzahl aller Punkte');
Write('incl. der Stützstellen ein (3 bis 10) : ');
Readln(AnzPunkte);
IF (AnzPunkte<3) OR (AnzPunkte>10) THEN
Halt;
InitGrafik;
BezInitBezier(AnzPunkte);
BezDat^.DrawPoint := SpeicherePunkte;
BezDat^.SetLastPoint := SpeicherePunkte;
BezDat^.SetFirstPoint := SpeicherePunkte;
x := GetMaxX DIV 2;
y := MaxY DIV 2;
Schrift('Start- und Endpunkt definieren',
'<SPACE> Schrittweite <ESC> Abbruch');
GetPoint(x, y, 1, StartColor);
GetPoint(x, y, AnzPunkte, StartColor);
Schrift('Stützpunkte definieren',
'<SPACE> Schrittweite <ESC> Abbruch');
FOR i := 2 TO AnzPunkte - 1 DO
GetPoint(x, y, i, StuetzColor);
Schrift('Animation wird berechnet',
'Bitte einen Moment Geduld...');
MakeMovie;
Schrift('', 'Animation mit Tastendruck starten');
REPEAT
UNTIL ReadKey>'';
ShowMovie;
BezDisposeBezier;
CloseGraph;
END.