[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]

{
>> I was wondering if anyone could show me the equations (and perhaps a
>> demo in standard pascal) of the following shapes. What I need to know is
>> where to plot the point.
>> Circle. (I've tried using the equation taught to me at school, but it
>> Line  (What I would like would be to be able to plot a line by giving it

There seems yet again to be enough interest/need so I'll post this stuff just
ONCE more.... somebody put this in SWAG or something.... PLEASE!!!

 [Okay Sean, here you go!  -Kerry]

You need a plot(x,y) procedure and a global color variable to use these as
posted.
}

{bresenham's line}
procedure line(x, y, x2, y2 : integer);
var
  d, dx, dy,
  ai, bi,
  xi, yi : integer;
begin
  if (x < x2) then
  begin
    xi := 1;
    dx := x2 - x;
  end
  else
  begin
    xi := - 1;
    dx := x - x2;
  end;

  if (y < y2) then
  begin
    yi := 1;
    dy := y2 - y;
  end
  else
  begin
    yi := - 1;
    dy := y - y2;
  end;

  plot(x, y);

  if dx > dy then
  begin
    ai := (dy - dx) * 2;
    bi := dy * 2;
    d  := bi - dx;
    repeat
      if (d >= 0) then
      begin
        inc(y, yi);
        inc(d, ai);
      end
      else
        inc(d, bi);

      inc(x, xi);
      plot(x, y);
    until (x = x2);
  end
  else
  begin
    ai := (dx - dy) * 2;
    bi := dx * 2;
    d  := bi - dy;
    repeat
      if (d >= 0) then
      begin
        inc(x, xi);
        inc(d, ai);
      end
      else
        inc(d, bi);

      inc(y, yi);
      plot(x, y);
    until (y = y2);
  end;
end;


{filled ellipse}
procedure disk(xc,  yc,  a,  b : integer);
var
  x, y      : integer;
  aa, aa2,
  bb, bb2,
  d, dx, dy : longint;
begin
  x   := 0;
  y   := b;
  aa  := longint(a) * a;
  aa2 := 2 * aa;
  bb  := longint(b) * b;
  bb2 := 2 * bb;
  d   := bb - aa * b + aa div 4;
  dx  := 0;
  dy  := aa2 * b;
  vLin(xc, yc - y, yc + y);

  while (dx < dy) do
  begin
    if (d > 0) then
    begin
      dec(y);
      dec(dy, aa2);
      dec(d, dy);
    end;
    inc(x);
    inc(dx, bb2);
    inc(d, bb + dx);
    vLin(xc - x, yc - y, yc + y);
    vLin(xc + x, yc - y, yc + y);
  end;

  inc(d, (3 * (aa - bb) div 2 - (dx + dy)) div 2);
  while (y >= 0) do
  begin
    if (d < 0) then
    begin
      inc(x);
      inc(dx, bb2);
      inc(d, bb + dx);
      vLin(xc - x, yc - y, yc + y);
      vLin(xc + x, yc - y, yc + y);
    end;
    dec(y);
    dec(dy, aa2);
    inc(d, aa - dy);
  end;
end;


[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]