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

  1. { Copyright (C) 1989 Adam Fritz, 133 Main St., Afton, N.Y. 13730 }
  2.  
  3. procedure StrokePolygon ( xc, yc : integer ; { center }
  4.                             r, n : word ; { radius and number of sides }
  5.                               ta : single ) ; { rotation angle (rad) }
  6.  
  7.      { PolyDAF - draw regular polygon using difference     }
  8.      {           angle method and fixed point artihmetic   }
  9.  
  10. var
  11.    ixar,iyar        : word ;    { aspect ratio parameters }
  12.    iar              : longint ; { aspect ratio B16 }
  13.    da               : single ;  { step angle }
  14.    icosdat2         : longint ; { difference equation coefficient B15 }
  15.    i                : integer ; { loop control }
  16.    ir               : longint ; { radius B6 }
  17.    ixa0,ixa1,ixa2   : longint ; { coordinate variables B6 }
  18.    iya0,iya1,iya2   : longint ; { coordinate variables B6 }
  19.    ix0,iy0          : integer ; { display variables B6 }
  20.  
  21. begin
  22.                                 { constraint test }
  23.    if (r > 0) and (r < 511) and (n > 2) then begin
  24.                                 { aspect ratio }
  25.       GetAspectRatio(ixar,iyar) ;
  26.       iar := SwapLong(longint(ixar)) div longint(iyar) ;
  27.                                 { step angle and functions }
  28.       da := 2.0 * Pi / n ;
  29.       icosdat2 := Round(cos(da) * 65536) ;
  30.                                 { initialize difference equations }
  31.  
  32.       ir := r shl 6 ;
  33.       ixa1 := Round(ir * cos(ta)) ;
  34.       ixa2 := Round(ir * cos(ta-da)) ;
  35.       iya1 := RoundScaleB16(Round(ir * sin(ta)) * iar) ;
  36.       iya2 := RoundScaleB16(Round(ir * sin(ta-da)) * iar) ;
  37.                                 { starting point with offset }
  38.       ix0 := RoundScaleB6(ixa1) ;
  39.       iy0 := RoundScaleB6(iya1) ;
  40.       MoveTo(xc+ix0,yc+iy0) ;
  41.                                 { polygon }
  42.       for i := 1 to n-1 do begin
  43.                                 { rotate coordinates }
  44.          ixa0 := RoundScaleB16(icosdat2 * ixa1) shl 1 - ixa2 ;
  45.          iya0 := RoundScaleB16(icosdat2 * iya1) shl 1 - iya2 ;
  46.                                 { draw chord }
  47.          LineTo(xc+RoundScaleB6(ixa0),yc+RoundScaleB6(iya0)) ;
  48.                                 { ladder down }
  49.          ixa2 := ixa1 ;  ixa1 := ixa0 ;
  50.          iya2 := iya1 ;  iya1 := iya0
  51.  
  52.       end ;
  53.                                 { closure }
  54.       LineTo(xc+ix0,yc+iy0)
  55.  
  56.    end
  57. end ;
  58.  
  59. { Copyright (C) 1989 Adam Fritz, 133 Main St., Afton, N.Y. 13730 }
  60.