fpc/rtl/dos/ppi/ellipse.ppi
1998-03-25 11:18:12 +00:00

139 lines
4.1 KiB
Plaintext

{
$Id$
This file is part of the Free Pascal run time library.
Copyright (c) 1993,97 by the Free Pascal development team.
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
function CalcEllipse(x,y:Integer;XRadius,YRadius:word):Integer;
var aq,bq,xq,yq,abq : Longint;
xp,yp,count : integer;
begin
XRadius:=(XRadius*10000) div XAsp;
YRadius:=(YRadius*10000) div YAsp;
aq :=XRadius * XRadius;
bq :=YRadius * YRadius;
abq:=aq * bq;
yp:=YRadius;
xp:=0;
count:=0;
{ Berechnung nach : X^2 / A^2 + Y^2 / B^2 = 1 }
{ umgestellt : X^2 * Y^2 * A^2 * B^2 = A^2*B^2 }
{ dadurch werden evtuelle Divisionen durch 0 vermieden }
{ und Integerarithmetik moeglich }
repeat
PWord(buffermem)[count ]:=x + xp;
PWord(buffermem)[count+1]:=y + yp;
PWord(buffermem)[count+2]:=x - xp;
PWord(buffermem)[count+3]:=y - yp;
xq:=xp * xp; yq:=yp * yp;
if xq * bq + yq * aq >= abq then yp:=yp-1 else xp:=xp+1;
Count:=Count+4;
until yp < 0;
CalcEllipse:=Count;
end;
Procedure _Ellipse(Count:Integer);
const aq:Integer=0;
begin
{ Das Zeichnen der Ellipse erfolgt in zwei Schleifen, um systematisch }
{ von oben nach unten zu zeichnen und somit ein staendiges Bank- }
{ umschalten zu verhindern }
while aq <> count do begin
PutPixel( PWord(buffermem)[aq] ,PWord(buffermem)[aq+3],aktcolor);
PutPixel( PWord(buffermem)[aq+2],PWord(buffermem)[aq+3],aktcolor);
aq:=aq+4;
end;
while aq <> 0 do begin
aq:=aq-4;
PutPixel( PWord(buffermem)[aq] ,PWord(buffermem)[aq+1],aktcolor);
PutPixel( PWord(buffermem)[aq+2],PWord(buffermem)[aq+1],aktcolor);
end;
end;
Procedure Fillellipse(x,y:Integer;XRadius,YRadius:word);
var Count,index:Word;
Count8:Word;
begin
_graphresult:=grOk;
if not isgraphmode then
begin
_graphresult:=grnoinitgraph;
exit;
end;
Count:=CalcEllipse(x,y,XRadius,YRadius);
if Count=0 then exit;
Count8:=Count-8;
index:=0;
while index < count do begin
while (PWord(buffermem)[index+1]=PWord(buffermem)[index+5]) and
(index < count8) do Index:=Index+4;
PatternLine(PWord(buffermem)[index],PWord(buffermem)[index+2],
PWord(buffermem)[index+3]);
Index:=Index+4;
end;
while index > 0 do begin
index:=index-4;
PatternLine(PWord(buffermem)[index],PWord(buffermem)[index+2],
PWord(buffermem)[index+1]);
while (PWord(buffermem)[index+1]=PWord(buffermem)[index-3]) and
(index > 4 ) do Index:=Index-4;
end;
if (aktColor <> aktFillSettings.Color) or (aktFillSettings.Pattern<>1)
then _Ellipse(Count);
end;
procedure Circle(x,y:integer;radius:word);
begin
_graphresult:=grOk;
if not isgraphmode then
begin
_graphresult:=grnoinitgraph;
exit;
end;
_Ellipse(CalcEllipse(x,y,radius,radius));
end;
{
$Log$
Revision 1.1 1998-03-25 11:18:42 root
Initial revision
Revision 1.3 1998/01/26 11:57:54 michael
+ Added log at the end
Working file: rtl/dos/ppi/ellipse.ppi
description:
----------------------------
revision 1.2
date: 1997/12/01 12:21:29; author: michael; state: Exp; lines: +13 -1
+ added copyright reference in header.
----------------------------
revision 1.1
date: 1997/11/27 08:33:51; author: michael; state: Exp;
Initial revision
----------------------------
revision 1.1.1.1
date: 1997/11/27 08:33:51; author: michael; state: Exp; lines: +0 -0
FPC RTL CVS start
=============================================================================
}