杭电hdu 1086 You can Solve a Geometry Problem too 线段相交

来源:互联网 发布:条码软件有哪些 编辑:程序博客网 时间:2024/05/18 06:25

http://acm.hdu.edu.cn/showproblem.php?pid=1086

判断两条线段是否相交。用叉乘来判断。

#include <stdio.h>struct Lpoint{double x;double y;};struct Llineseg{Lpoint a;Lpoint b;};//叉乘double xmulti(Lpoint p1, Lpoint p2, Lpoint p0){return ((p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y));}double mx(double a, double b){return a > b ? a : b;}double mn(double a, double b){return a < b ? a : b;}//判断相交int isinterls(Llineseg u, Llineseg v){return ((mx(u.a.x, u.b.x) >= mn(v.a.x, v.b.x)) &&(mx(v.a.x, v.b.x) >= mn(u.a.x, u.b.x)) &&(mx(u.a.y, u.b.y) >= mn(v.a.y, v.b.y)) &&(mx(v.a.y, v.b.y) >= mn(u.a.y, u.b.y)) &&(xmulti(v.a, u.b, u.a) * xmulti(u.b, v.b, u.a) >= 0) &&(xmulti(u.a, v.b, v.a) * xmulti(v.b, u.b, v.a) >= 0));}int main(){Llineseg line[101];int n, i, j, s;while(scanf("%d", &n)&&n){s = 0;scanf("%lf%lf%lf%lf", &line[0].a.x, &line[0].a.y, &line[0].b.x, &line[0].b.y);for(i = 1; i < n; i ++){scanf("%lf%lf%lf%lf", &line[i].a.x, &line[i].a.y, &line[i].b.x, &line[i].b.y);for(j = 0; j < i; j ++){if(isinterls(line[j], line[i]))s ++;}}printf("%d\n", s);}return 0;}