home *** CD-ROM | disk | FTP | other *** search
- #include "mytypes.h"
- #include "scrnio.h"
- #include "control.h"
- #include "bezpt.h"
-
- BezCoord Bezpt[MaxSegs+1];
-
- int NumBezPts;
- int ActSeg;
- bool SegDrawn;
- int BezMesh = DefBezMeshVal;
- float BezStepSize = 1.0/DefBezMeshVal;
-
- void SetBezMesh( value )
- int value;
- {
- BezMesh = value;
- BezStepSize = 1.0/value;
- }
-
-
- void ClearSegments()
- {
- NumBezPts = 0;
- ActSeg = 0;
- }
-
-
- static float xa, xb, xc, xd;
- static float ya, yb, yc, yd;
- /*
- * start up calculations that must be performed before calling
- * CalcBezPt on any given segment
- */
- void InitCalcBez()
- {
- xa = -StartPtX(ActSeg) + 3.0*( Cntrl1X(ActSeg) - Cntrl2X(ActSeg))
- + EndPtX(ActSeg);
- xb = 3.0 *( StartPtX(ActSeg) + Cntrl2X(ActSeg) - 2.0*Cntrl1X(ActSeg));
- xc = 3.0*( Cntrl1X(ActSeg) - StartPtX(ActSeg));
- xd = StartPtX(ActSeg);
-
- ya = -StartPtY(ActSeg) + 3.0*( Cntrl1Y(ActSeg) - Cntrl2Y(ActSeg))
- + EndPtY(ActSeg);
- yb = 3.0 *( StartPtY(ActSeg) + Cntrl2Y(ActSeg) - 2.0*Cntrl1Y(ActSeg));
- yc = 3.0*( Cntrl1Y(ActSeg) - StartPtY(ActSeg));
- yd = StartPtY(ActSeg);
- }
-
- /*
- * calculate a point on the bezier curve of a segment
- */
- void CalcBezPt( t, xvp, yvp)
- float t;
- float *xvp, *yvp;
- {
- *xvp = (( t*xa + xb) * t + xc) *t + xd;
-
- *yvp = (( t*ya + yb) * t + yc) *t + yd;
- }
-
-
-
- void XdrawBezSeg()
- {
- float t;
- float ftox, ftoy;
- int fromx, fromy, tox, toy;
-
- InitCalcBez();
- for( fromx = StartPtX(ActSeg), fromy = StartPtY(ActSeg), t=BezStepSize;
- t < 1.0; fromx = tox, fromy = toy, t+= BezStepSize ) {
-
- CalcBezPt( t, &ftox, &ftoy );
- tox = (int)ftox;
- toy = (int)ftoy;
- DrawLine( fromx, fromy, tox, toy, XOR );
- DrawPnt( tox, toy, XOR );
- }
- DrawLine( fromx, fromy, EndPtX(ActSeg), EndPtY(ActSeg),XOR);
- }
-
-
-
- void XdrawAllBezSegs()
- {
- ResetActSeg();
- do {
- XdrawBezSeg();
- NextSeg();
- } while( ActSeg);
-
- DrawStartPt(); /* Leonards changes */
- DrawEndPt(); /* Leonards changes */
- DrawControl0();
- DrawControl1();
- }
-
-
-
- void ResetCurve()
- {
- if( NumBezPts > 0 && CurMode == FITBEZIER ) {
- int i;
-
- ClrWindow(true);
- for( i = 0; i < NumBezPts; i++ ) {
- Bezpt[i].x.cur1 = Bezpt[i].x.prev2 = Bezpt[i].x.cur0;
- Bezpt[i].y.cur1 = Bezpt[i].y.prev2 = Bezpt[i].y.cur0;
- }
- ActSeg = 0;
-
- XdrawAllBezSegs();
- }
- }
-
-
- /*
- * set the value of a bezpt element
- */
- static void SetBezPt( xval, yval )
- int xval, yval;
- {
- BezVal *i;
-
- i = &Bezpt[NumBezPts-1].x;
- i->cur0 = i->prev2 = i->cur1 = xval;
- i = &Bezpt[NumBezPts-1].y;
- i->cur0 = i->prev2 = i->cur1 = yval;
- }
-
-
-
-
- void InitBezPt(xval,yval)
- int xval, yval;
- {
- int segno;
-
- NumBezPts++;
- SetBezPt(xval,yval);
- segno = NumBezPts -2;
- if( segno >= 0) {
-
- DrawLine( StartPtX( segno), StartPtY(segno),
- EndPtX( segno), EndPtY(segno), XOR );
- }
- }
-
-
-
-
-
- void EditBezPt(xval, yval)
- {
- int segno = NumBezPts -2;
-
- DrawLine( StartPtX(segno), StartPtY(segno),
- EndPtX( segno ), EndPtY(segno), XOR );
-
- SetBezPt(xval, yval);
-
- DrawLine( StartPtX( segno), StartPtY(segno),
- EndPtX( segno), EndPtY(segno), XOR );
- }
-
-