home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / CNC11TP.ZIP / ELIPDA2.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-01-20  |  2.5 KB  |  70 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.      { ElipDA2 - draw stroke ellipse using difference      }
  8.      {           angle method and semi-circular symmetry   }
  9.  
  10. var
  11.    ixar,iyar        : word ;    { aspect ratio parameters }
  12.    ar               : single ;  { aspect ratio }
  13.    r                : word ;    { effective radius }
  14.    da,cosda,sinda   : single ;  { step angle and functions }
  15.    ida,ndad2        : integer ; { loop control }
  16.    cosdat2          : single ;  { difference equation coefficient }
  17.    xa0,xa1,xa2      : single ;  { cosine generator variables }
  18.    yb0,yb1,yb2      : single ;  { sine generator variables }
  19.    costa,sinta      : single ;  { rotation variables }
  20.    acosta,asinta    : single ;  { rotation variables - aspect }
  21.    ix0,iy0,ix1,iy1  : integer ; { display variables }
  22.  
  23. begin
  24.                                 { aspect ratio }
  25.    GetAspectRatio(ixar,iyar) ;
  26.    ar := ixar/iyar ;
  27.                                 { step angle functions }
  28.    if a > b then
  29.       r := a
  30.    else
  31.       r := b ;
  32.    da := 2.0 * sqrt(1.0/r) ;
  33.    ndad2 := Round(Pi / da) ;
  34.    da := Pi / ndad2 ;
  35.    cosda := cos(da) ;
  36.    cosdat2 := cosda * 2.0 ;
  37.                                 { offset, prescale, reflect }
  38.    xa1 := a + dr ;
  39.    xa2 := (a+dr) * cosda ;
  40.    yb1 := 0.0 ;
  41.    yb2 := - (b+dr) * sin(da) ;
  42.                                 { aspect and rotation }
  43.    costa := cos(ta) ;
  44.    sinta := sin(ta) ;
  45.    acosta := ar * costa ;
  46.    asinta := ar * sinta ;
  47.                                 { starting point }
  48.    ix0 := Round(xa1 * costa) ;
  49.    iy0 := -Round(xa1 * asinta) ;
  50.                                 { ellipse }
  51.    for ida := 1 to ndad2 do begin
  52.                                 { step coordinates }
  53.       xa0 := cosdat2 * xa1 - xa2 ;
  54.       yb0 := cosdat2 * yb1 - yb2 ;
  55.                                 { rotate }
  56.       ix1 := Round(xa0 * costa + yb0 * sinta) ;
  57.       iy1 := Round(-xa0 * asinta + yb0 * acosta) ;
  58.                                 { semi-elliptic symmetry }
  59.       Line(xc+ix0,yc+iy0,xc+ix1,yc+iy1) ;
  60.       Line(xc-ix0,yc-iy0,xc-ix1,yc-iy1) ;
  61.                                 { ladder down }
  62.       xa2 := xa1 ;  xa1 := xa0 ;
  63.       yb2 := yb1 ;  yb1 := yb0 ;
  64.       ix0 := ix1 ;  iy0 := iy1
  65.  
  66.    end
  67. end ;
  68.  
  69. { Copyright (C) 1989 Adam Fritz, 133 Main St., Afton, N.Y. 13730 }
  70.