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

  1. { Copyright (C) 1989 Adam Fritz, 133 Main St., Afton, N.Y. 13730 }
  2.  
  3. procedure StrokeEllipse ( xc, yc : integer ; { center }
  4.                             a, b : word ; { radii }
  5.                               ta : single ) ; { rotation angle (rad) }
  6.  
  7.      { ElipDAM - draw ellipse using difference angle       }
  8.      {           method and `minimum' angle step           }
  9.  
  10. const
  11.    isinda : longint = $1FF4 ;
  12.    icosda : longint = $FE00 ;
  13.  
  14. var
  15.    ixar,iyar        : word ;    { aspect ratio parameters }
  16.    iar              : longint ; { aspect ratio B16 }
  17.    ida              : integer ; { loop control }
  18.    ira,irb          : longint ; { radii offset and scaled B6 }
  19.    ixa0,ixa1,ixa2   : longint ; { cosine generator variables B22 }
  20.    iyb0,iyb1,iyb2   : longint ; { sine generator variables B22 }
  21.    icosta,isinta    : longint ; { rotation parameters B10 }
  22.    iacosta,iasinta  : longint ; { rotation parameters - aspect B10 }
  23.    ix0,iy0,ix1,iy1  : integer ; { display variables B0 }
  24.  
  25. begin
  26.                                 { constraint test }
  27.    if (a < 512) and (b < 512) then begin
  28.                                 { aspect ratio }
  29.       GetAspectRatio(ixar,iyar) ;
  30.       iar := SwapLong(longint(ixar)) div longint(iyar) ;
  31.                                 { offset, prescale, reflect }
  32.       ira := a shl 6 + idr ;
  33.       ixa1 := SwapLong(ira) ;
  34.       ixa2 := ira * icosda ;
  35.       irb := b shl 6 + idr ;
  36.       iyb1 := 0 ;
  37.       iyb2 := -irb * isinda ;
  38.                                 { aspect and rotation }
  39.       icosta := Round(cos(ta) * 1024) ;
  40.       isinta := Round(sin(ta) * 1024) ;
  41.       iacosta := RoundScaleB16(iar * icosta) ;
  42.       iasinta := RoundScaleB16(iar * isinta) ;
  43.                                 { starting point }
  44.       ix0 := RoundScaleB16(LongHi(ixa1) * icosta) ;
  45.       iy0 := -RoundScaleB16(LongHi(ixa1) * iasinta) ;
  46.       MoveTo(xc+ix0,yc+iy0) ;
  47.                                 { ellipse }
  48.       for ida := 1 to 49 do begin
  49.                                 { step coordinates }
  50.          ixa0 := (ixa1 - ixa1 div 128) shl 1 - ixa2 ;
  51.          iyb0 := (iyb1 - iyb1 div 128) shl 1 - iyb2 ;
  52.                                 { rotate }
  53.          ix1 := RoundScaleB16(LongHi(ixa0) * icosta +
  54.                  LongHi(iyb0) * isinta) ;
  55.          iy1 := RoundScaleB16(-LongHi(ixa0) * iasinta +
  56.                  LongHi(iyb0) * iacosta) ;
  57.                                 { draw stroke }
  58.          LineTo(xc+ix1,yc+iy1) ;
  59.                                 { ladder down }
  60.          ixa2 := ixa1 ;  ixa1 := ixa0 ;
  61.          iyb2 := iyb1 ;  iyb1 := iyb0
  62.  
  63.       end ;
  64.                                 { closure }
  65.       LineTo(xc+ix0,yc+iy0)
  66.  
  67.    end
  68. end ;
  69.  
  70. { Copyright (C) 1989 Adam Fritz, 133 Main St., Afton, N.Y. 13730 }
  71.