#include #include #include #include struct point { int x, y; }; struct segment { struct point p1, p2; }; int turn(struct point q0, struct point q1, struct point q2) { int dx1, dx2, dy1, dy2; dx1=q1.x - q0.x; dy1 = q1.y - q0.y; dx2 = q2.x - q0.x; dy2 = q2.y - q0.y; if (dx1*dy2 > dy1*dx2) return 1; if (dx1*dy2 < dy1*dx2) return -1; if ((dx1*dx2 < 0)||(dy1*dy2<0)) return -1; if ((dx1*dx1+dy1*dy1) < (dx2*dx2+dy2*dy2)) return 1; return 0; } int intersect(struct segment s1, struct segment s2) { return ((turn(s1.p1, s1.p2, s2.p1)*turn(s1.p1,s1.p2,s2.p2))<=0) && ((turn(s2.p1, s2.p2, s1.p1)*turn(s2.p1,s2.p2,s1.p2))<=0); } main() { char dummy; Display *d; Window w; GC gc; Font f; XEvent e; int i, black, white; struct segment test1, test2; // d=XOpenDisplay("tika:0"); d=XOpenDisplay((getenv("DISPLAY") != NULL)?getenv( "DISPLAY"):":0"); f=XLoadFont(d,"r14"); black = BlackPixel(d, 0); white = WhitePixel(d, 0); w=XCreateSimpleWindow(d,DefaultRootWindow(d),5,5,400,400,5, black, white); XSelectInput(d,w,ButtonPressMask|ButtonReleaseMask); XMapWindow(d,w); gc=XCreateGC(d,w,0,0); XSetFont(d,gc,f); XFlush(d); while(1){ for (i=1;i<=2;i++){ XNextEvent(d,&e); switch(e.type){ case ButtonPress: test1.p1.x=e.xbutton.x; test1.p1.y=e.xbutton.y; break; case ButtonRelease: test1.p2.x=e.xbutton.x; test1.p2.y=e.xbutton.y; XDrawLine(d,w,gc,test1.p1.x,test1.p1.y,test1.p2.x,test1.p2.y); break; } } for (i=1;i<=2;i++){ XNextEvent(d,&e); switch(e.type){ case ButtonPress: test2.p1.x=e.xbutton.x; test2.p1.y=e.xbutton.y; break; case ButtonRelease: test2.p2.x=e.xbutton.x; test2.p2.y=e.xbutton.y; XDrawLine(d,w,gc,test2.p1.x,test2.p1.y,test2.p2.x,test2.p2.y); break; } } if (intersect(test1, test2)) printf("intersect\n"); else printf("no intersection\n"); } }