home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d170 / surf.lha / Surf / src / bezpt.c next >
C/C++ Source or Header  |  1988-11-22  |  3KB  |  165 lines

  1. #include "scrnio.h"
  2. #include "control.h"
  3. #include "bezpt.h"
  4. #include "mytypes.h"
  5.  
  6. BezCoord Bezpt[MaxSegs+1];
  7.  
  8. int NumBezPts;
  9. int ActSeg;
  10. bool SegDrawn;
  11. int BezMesh = DefBezMeshVal;
  12. float BezStepSize = 1.0/DefBezMeshVal;
  13.  
  14. void SetBezMesh( value )
  15.     int value;
  16. {
  17.     BezMesh = value;
  18.     BezStepSize = 1.0/value;
  19. }
  20.  
  21.  
  22. void ClearSegments()
  23. {
  24.     NumBezPts = 0;
  25.     ActSeg = 0;
  26. }
  27.  
  28.  
  29. static  float xa, xb, xc, xd;
  30. static  float ya, yb, yc, yd;
  31. /*
  32.  * start up calculations that must be performed before calling
  33.  * CalcBezPt on any given segment
  34.  */
  35. void InitCalcBez()
  36. {
  37.         xa = -StartPtX(ActSeg) + 3.0*( Cntrl1X(ActSeg) - Cntrl2X(ActSeg))
  38.             + EndPtX(ActSeg);
  39.         xb = 3.0 *( StartPtX(ActSeg) + Cntrl2X(ActSeg) - 2.0*Cntrl1X(ActSeg));
  40.         xc = 3.0*( Cntrl1X(ActSeg) - StartPtX(ActSeg));
  41.         xd = StartPtX(ActSeg);
  42.  
  43.         ya = -StartPtY(ActSeg) + 3.0*( Cntrl1Y(ActSeg) - Cntrl2Y(ActSeg))
  44.             + EndPtY(ActSeg);
  45.         yb = 3.0 *( StartPtY(ActSeg) + Cntrl2Y(ActSeg) - 2.0*Cntrl1Y(ActSeg));
  46.         yc = 3.0*( Cntrl1Y(ActSeg) - StartPtY(ActSeg));
  47.         yd = StartPtY(ActSeg);
  48. }
  49.  
  50. /*
  51.  * calculate a point on the bezier curve of a segment
  52.  */
  53. void CalcBezPt( t, xvp, yvp)
  54.     float t;
  55.     float *xvp, *yvp;
  56. {
  57.     *xvp = (( t*xa + xb) * t + xc) *t + xd;
  58.  
  59.     *yvp = (( t*ya + yb) * t + yc) *t + yd;
  60. }
  61.  
  62.  
  63.  
  64. void XdrawBezSeg()
  65. {
  66.     float t;
  67.     float ftox, ftoy;
  68.     int fromx, fromy, tox, toy;
  69.  
  70.     InitCalcBez();
  71.     for( fromx = StartPtX(ActSeg), fromy = StartPtY(ActSeg), t=BezStepSize;
  72.         t < 1.0; fromx = tox, fromy = toy, t+= BezStepSize ) {
  73.  
  74.         CalcBezPt( t, &ftox, &ftoy );
  75.         tox = (int)ftox;
  76.         toy = (int)ftoy;
  77.         DrawLine( fromx, fromy, tox, toy, XOR );
  78.         DrawPnt( tox, toy, XOR );
  79.     }
  80.     DrawLine( fromx, fromy, EndPtX(ActSeg), EndPtY(ActSeg),XOR);
  81. }
  82.  
  83.  
  84.  
  85. void XdrawAllBezSegs()
  86. {
  87.     ResetActSeg();
  88.     do {
  89.         XdrawBezSeg();
  90.         NextSeg();
  91.     } while( ActSeg);
  92.  
  93.     DrawControl0();
  94.     DrawControl1();
  95. }
  96.  
  97.  
  98.  
  99. void ResetCurve()
  100. {
  101.     if( NumBezPts > 0 && CurMode == FITBEZIER ) {
  102.         int i;
  103.  
  104.         ClrWindow(true);
  105.         for( i = 0; i < NumBezPts; i++ ) {
  106.             Bezpt[i].x.cur1 = Bezpt[i].x.prev2 = Bezpt[i].x.cur0;
  107.             Bezpt[i].y.cur1 = Bezpt[i].y.prev2 = Bezpt[i].y.cur0;
  108.         }
  109.         ActSeg = 0;
  110.  
  111.         XdrawAllBezSegs();
  112.     }
  113. }
  114.  
  115.  
  116. /*
  117.  * set the value of a bezpt element
  118.  */
  119. static void SetBezPt( xval, yval )
  120.     int xval, yval;
  121. {
  122.     BezVal *i;
  123.  
  124.     i = &Bezpt[NumBezPts-1].x;
  125.     i->cur0 = i->prev2 = i->cur1 = xval;
  126.     i = &Bezpt[NumBezPts-1].y;
  127.     i->cur0 = i->prev2 = i->cur1 = yval;
  128. }
  129.  
  130.  
  131.  
  132.  
  133. void InitBezPt(xval,yval)
  134. int xval, yval;
  135. {
  136.     int segno;
  137.  
  138.     NumBezPts++;
  139.     SetBezPt(xval,yval);
  140.     segno = NumBezPts -2;
  141.     if( segno >= 0) {
  142.  
  143.         DrawLine( StartPtX( segno), StartPtY(segno),
  144.                 EndPtX( segno), EndPtY(segno), XOR );
  145.     }
  146. }
  147.  
  148.  
  149.  
  150.  
  151.  
  152. void EditBezPt(xval, yval)
  153. {
  154.     int segno = NumBezPts -2;
  155.  
  156.     DrawLine( StartPtX(segno), StartPtY(segno),
  157.           EndPtX( segno ), EndPtY(segno), XOR );
  158.  
  159.     SetBezPt(xval, yval);
  160.  
  161.     DrawLine( StartPtX( segno), StartPtY(segno),
  162.           EndPtX( segno), EndPtY(segno), XOR );
  163. }
  164.  
  165.