home *** CD-ROM | disk | FTP | other *** search
- #include "macs.hpp"
- #include <stdlib.h>
-
- void pushback(long x1,long y1,long &x2,long &y2,
- long xp1, long yp1, long xp2, long yp2, int xdir, int ydir, int inside)
- {
-
- // determine if the lines are intersecting before we set back
-
- // if (yp1==yp2)
- // {
- // if (inside && y2>=yp1)
-
- }
-
-
- /* int setback_intersect(long x1,long y1,long &x2,long &y2,
- long xp1, long yp1, long xp2, long yp2)
- {
- long mx1,my1,b1,mx2,my2,b2,side1,side2,tx2,ty2;
- my1=(y2-y1);
- if (!my1) // is the first line strait across?
- {
- side1=yp1-y2; // if yes, check to see if the other is top/bottom
- side2=yp2-y2;
- mx1=(x2-x1); // make sure we give this a value
- b1=y2;
- }
- else
- {
- mx1=(x2-x1); // if the line strait up and down?
- if (!mx1)
- {
- side1=xp1-x1;
- side2=xp2-x2;
- } else
- {
- b1=y1-(my1*x1/mx1); // calculate the y intercept
- side1=yp1-((my1*xp1)/mx1+b1);
- side2=yp2-((my1*xp2)/mx1+b1);
- }
- }
- if ((side1>=0 && side2<=0) || (side1<=0 && side2>=0))
- {
- my2=(yp2-yp1);
- if (!my2)
- {
- side1=y1-yp2;
- side2=y2-yp2;
- b2=yp1;
- mx2=(xp2-xp1);
- }
- else
- {
- mx2=(xp2-xp1);
- if (!mx2)
- {
- side1=x1-xp2;
- side2=x2-xp2;
- } else
- {
- b2=yp1-(my2*xp1/mx2);
- side1=y1-((my2*x1)/mx2+b2);
- side2=y2-((my2*x2)/mx2+b2);
- }
- }
-
- // check two wierd cases where the lines are parallel
- if (mx1==mx2 && mx1==0)
- if (y2<yp1 || y1>yp2)
- side1=side2=1;
- else side1=side2=0;
-
- if (my1==my2 && my2==0)
- if (x2<xp1 || x1>xp2)
- side1=side2=1;
- else side1=side2=0;
-
- if ((side1>=0 && side2<=0) || (side1<=0 && side2>=0))
- {
- tx2=x2; ty2=y2;
- int xadd,yadd;
- if (x1>x2) xadd=1; else if (x1<x2) xadd=-1; else xadd=0;
- if (y1>y2) yadd=1; else if (y1<y2) yadd=-1; else yadd=0;
-
- // now find the point of intersection
- if (mx1==0) // if the first line is strait up & down
- {
- if (mx2==0) // if they are both strait up then
- { tx2=x1; ty2=y1; } // they connect everywhere, don't let it move!
- else
- ty2=my2*x2/mx2+b2+yadd;
- } else if (mx2==0)
- { tx2=xp1+xadd;
- ty2=my1*tx2/mx1+b1;
- }
- else
- {
- if (my1==0)
- if (my2==0)
- { tx2=x1; ty2=y1; }
- else tx2=mx2*(y1-b2)/my2+xadd;
- else if (my2==0)
- {
- ty2=yp1+yadd;
- tx2=mx1*(ty2-b1)/my1;
- }
- else
- {
- if (abs(mx1)>abs(my1))
- {
- long ae_bd=my1*mx2-mx1*my2;
- CONDITION(ae_bd,"line intersect fuck up");
- tx2=(mx1*mx2*(b2-b1))/ae_bd+xadd;
- ty2=my1*tx2/mx1+b1;
- }
- else
- {
- long db_ea=(my2*mx1-mx2*my1);
- CONDITION(db_ea,"line intersect fuck up");
- ty2=(mx1*b1*my2-my1*mx2*b2)/db_ea+yadd;
- tx2=mx1*(ty2-b1)/my1;
- }
- }
- }
-
- if (abs(tx2-x1)<abs(x2-x1) || abs(ty2-y1)<abs(y2-y1))
- {
- x2=tx2;
- y2=ty2;
- return 1;
- }
- }
- }
- return 0;
- } */
-
-
- int setback_intersect(long x1,long y1,long &x2,long &y2,
- long xp1, long yp1, long xp2, long yp2,
- long inside) // which side is inside the polygon? (0 always setback)
- {
- // the line equations will be put in the form
- // x(y2-y1)+y(x1-x2)-x1*y2+x2*y1=0
- // A B C
-
- long a1,b1,c1,a2,b2,c2,r1,r2;
-
- a1=y2-y1;
- b1=x1-x2;
- c1=-x1*y2+x2*y1;
-
- if (yp1<yp2 || (yp1==yp2 && xp1>xp2)) // use only increasing functions
- {
- r1=yp1; yp1=yp2; yp2=r1; // swap endpoints if wrong order
- r1=xp1; xp1=xp2; xp2=r1;
- }
-
- long xdiff,ydiff;
- /* long xdiff=abs(xp1-xp2),ydiff=yp1-yp2;
- if (xdiff>=ydiff) // increment the endpoints
- if (xp2<xp1) { xp2--; xp1++; }
- else { xp2++; xp1--; }
-
- if (xdiff<=ydiff)
- {
- yp1++;
- yp2--;
- } */
-
-
- r1=xp1*a1+yp1*b1+c1;
- r2=xp2*a1+yp2*b1+c1;
-
- if ((r1^r2)<=0 || r1==0 || r2==0) // signs must be different to intersect
- {
- a2=yp2-yp1;
- b2=xp1-xp2;
- c2=-xp1*yp2+xp2*yp1;
- r1=x1*a2+y1*b2+c2;
- r2=x2*a2+y2*b2+c2;
-
- if ((r1^r2)<=0 || r1==0 || r2==0)
- {
- if ( ((xp1<xp2) && ((r2^inside)>0)) ||
- (xp1>=xp2 && ((r2^inside)<0)) ||
- inside==0 || r2==0)
- {
- long ae=a1*b2,bd=b1*a2;
- if (ae!=bd) // co-linear returns 0
- {
- x2=(b1*c2-b2*c1)/(ae-bd);
- y2=(a1*c2-a2*c1)/(bd-ae);
- xdiff=abs(x2-x1);
- ydiff=abs(y2-y1);
- // if (xdiff<=ydiff) // push the intersection back one pixel
- // {
- if (y2!=y1)
- {
- if (y2>y1)
- y2--;
- else y2++;
- }
- // }
- // if (xdiff>=ydiff)
- // {
- if (x2!=x1)
- {
- if (x2>x1)
- x2--;
- else x2++;
- }
- // }
-
- if (inside) // check to make sure end point is on the
- { // right side
- r1=x1*a2+y1*b2+c2;
- r2=x2*a2+y2*b2+c2;
- if ((r2!=0 && ((r1^r2)<0)))
- {
- x2=x1;
- y2=y1;
- }
- }
- return 1;
- }
- }
- }
- }
- return 0;
-
- }
-
-