123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- {
- $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
- =============================================================================
- }
|