| Code: int signum(float x) { if(x > 0) return 1; if(x < 0) return -1; return 0; }
float qua(float x) { return x*x; }
float vectorproductz(float px,float py,float qx,float qy) { return px*qy - py*qx; }
float distance(float px,float py,float qx,float qy) { return (float) sqrt(qua(qx-px)+qua(qy-py)); }
int segmeninplanetintersect( float ax,float ay, float bx,float by, float cx,float cy, float dx,float dy ) { // vector AB float abx = bx - ax, aby = by - ay; // vector CD float cdx = dx - cx, cdy = dy - cy;
// sgn (AB x AC) * (0,0,1) int abac = signum( vectorproductz(abx,aby,cx-ax,cy-ay) );
// sgn (AB x AD) * (0,0,1) int abad = signum( vectorproductz(abx,aby,dx-ax,dy-ay) );
// sgn (CD x CA) * (0,0,1) int cdca = signum( vectorproductz(cdx,cdy,ax-cx,ay-cy) );
// sgn (CD x CB) * (0,0,1) int cdcb = signum( vectorproductz(cdx,cdy,bx-cx,by-cy) );
// buffers for the maximal and current distance float distmax,dist;
if(abac == 0 && abad == 0 && cdca == 0 && cdcb == 0) { distmax = distance(ax,ay,cx,cy);
dist = distance(ax,ay,dx,dy); if(dist > distmax) distmax = dist;
dist = distance(bx,by,cx,cy); if(dist > distmax) distmax = dist;
dist = distance(bx,by,dx,dy); if(dist > distmax) distmax = dist;
return distance(0,0,abx,aby) + distance(0,0,cdx,cdy) >= distmax; }
return abac != abad && cdca != cdcb; } | |