home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / CNC11TP.ZIP / CIRCDAF.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-01-19  |  2.4 KB  |  64 lines

  1. { Copyright (C) 1989 Adam Fritz, 133 Main St., Afton, N.Y. 13730 }
  2.  
  3. procedure StrokeCircle ( xc, yc : integer ; r : word ) ;
  4.  
  5.      { CircDAF - draw circle using difference angle method }
  6.      {           and fixed point arithmetic                }
  7.  
  8. var
  9.    ixar,iyar        : word ;    { aspect ratio parameters }
  10.    iar              : longint ; { aspect ratio B16 }
  11.    da,cosda         : single ;  { step angle and function }
  12.    icosda,isinda    : longint ; { step angle functions B16 }
  13.    icosdat2         : longint ; { generator coefficient B16 }
  14.    ida,nda          : integer ; { loop control }
  15.    ir               : longint ; { offset radius B6 }
  16.    ixa0,ixa1,ixa2   : integer ; { coordinate variables B6 }
  17.    iya0,iya1,iya2   : integer ; { coordinate variables B6 }
  18.    ix0,iy0          : integer ; { display variables B0 }
  19.  
  20. begin
  21.                                 { constraint test }
  22.    if r < 510 then begin
  23.                                 { aspect ratio }
  24.       GetAspectRatio(ixar,iyar) ;
  25.       iar := SwapLong(longint(ixar)) div longint(iyar) ;
  26.                                 { step angle and functions }
  27.       da := 2.0 * sqrt(1.0/r) ;
  28.       nda := Round(2.0 * Pi / da) ;
  29.       if Odd(nda) then Inc(nda) ;
  30.       da := 2.0 * Pi / nda ;
  31.       cosda := cos(da) ;
  32.       icosda := Round(cosda * 65536) ;
  33.       isinda := Round(sin(da) * 65536) ;
  34.       icosdat2 := Round(cosda * 131072) ;
  35.                                 { initialize differences and offset }
  36.       ir := r shl 6 + idr ;
  37.       ixa2 := RoundScaleB16(ir * icosda) ;
  38.       ixa1 := ir ;
  39.       iya2 := -RoundScaleB16(LongHi(ir * isinda) * iar) ;
  40.       iya1 := 0 ;
  41.                                 { starting point }
  42.       ix0 := RoundScaleB6(ir) ;
  43.       iy0 := 0 ;
  44.       MoveTo(xc+ix0,yc) ;
  45.                                 { circle }
  46.       for ida := 1 to nda-1 do begin
  47.                                 { rotate coordinates }
  48.          ixa0 := RoundScaleB16(icosdat2 * ixa1) - ixa2 ;
  49.          iya0 := RoundScaleB16(icosdat2 * iya1) - iya2 ;
  50.                                 { chord }
  51.          LineTo(xc+RoundScaleB6(ixa0),yc+RoundScaleB6(iya0)) ;
  52.                                 { ladder down }
  53.          ixa2 := ixa1 ;  ixa1 := ixa0 ;
  54.          iya2 := iya1 ;  iya1 := iya0
  55.  
  56.       end ;
  57.                                 { closure }
  58.       LineTo(xc+ix0,yc+iy0)
  59.  
  60.    end
  61. end ;
  62.  
  63. { Copyright (C) 1989 Adam Fritz, 133 Main St., Afton, N.Y. 13730 }
  64.