home *** CD-ROM | disk | FTP | other *** search
- {1) An efficient/optimised line-drawing routine (in Pascal
- or Asm) based on (or better than) the Bres. Line algorithm.
- }
-
- {$R-,S-}
-
- Uses
- Crt, Dos;
-
- Procedure PutPixel(X, Y : Word; Color : Byte);
- begin
- Mem[$A000:Y*320+X] := Color
- end;
-
- Procedure Switch(Var First, Second : Integer);
- { Exchange the values of First and second }
- Var
- Temp : Integer;
- begin
- Temp := First;
- First := Second;
- Second := Temp;
- end; { Switch }
-
- Procedure Line(X1, Y1, X2, Y2, Color : Integer);
- { Uses Bressenham's algorithm For drawing a line }
- Var
- LgDelta, ShDelta, LgStep, ShStep, Cycle, PointAddr : Integer;
-
- begin
- LgDelta := X2 - X1;
- ShDelta := Y2 - Y1;
- if LgDelta < 0 then
- begin
- LgDelta := -LgDelta;
- LgStep := -1;
- end
- else
- LgStep := 1;
- if ShDelta < 0 then
- begin
- ShDelta := -ShDelta;
- ShStep := -1;
- end
- else
- ShStep := 1;
- if LgDelta > ShDelta then
- begin
- Cycle := LgDelta shr 1; { LgDelta / 2 }
- While X1 <> X2 do
- begin
- Mem[$A000:Y1*320+X1] := Color; { PutPixel(X1, Y1, Color); }
- Inc(X1, LgStep);
- Inc(Cycle, ShDelta);
- if Cycle > LgDelta then
- begin
- Inc(Y1, ShStep);
- Dec(Cycle, LgDelta);
- end;
- end;
- end
- else
- begin
- Cycle := ShDelta shr 1; { ShDelta / 2 }
- Switch(LgDelta, ShDelta);
- Switch(LgStep, ShStep);
- While Y1 <> Y2 do
- begin
- Mem[$A000:Y1*320+X1] := Color; { PutPixel(X1, Y1, Color); }
- Inc(Y1, LgStep);
- Inc(Cycle, ShDelta);
- if Cycle > LgDelta then
- begin
- Inc(X1, ShStep);
- Dec(Cycle, LgDelta);
- end;
- end;
- end;
- end; { Line }
-
- Procedure SetMode(Mode : Byte);
- { Interrupt $10, sub-Function 0 - Set video mode }
- Var
- Regs : Registers;
- begin
- With Regs do
- begin
- AH := 0;
- AL := Mode;
- end;
- Intr($10, Regs);
- end; { SetMode }
-
- Var
- x,y,d:Word;
- r:Real;
-
- begin { example }
- SetMode($13); { 320x200 256 color mode For VGA and MCGA cards }
- For d := 0 to 360 * 10 do
- begin
- r := (d * PI) * 0.1 / 180;
- x := round(sin(r * 5) * 90) + 160;
- y := round(cos(r) * 90) + 100;
- line(160,100,x,y,x div 4);
- end;
- Repeat Until port[$60] = 1; { hit esc to end }
-
- SetMode($03) { Text mode }
- end.