java判断线段是否相交函数_判断线段是否相交… | 学步园

判断直线是否相交,貌似很容易,直接用一个向量叉乘公式:x1*y2-x2*y1.如果结果为0,则直线是平行或者重合,否则必然相交...

但如何判断两条线段是否相交呢?我们给出了两条线段的四个端点,这两条条线段必须跨过另一条线段则必然相交,所以只需要算出两个端点分别在一条线段的两侧就OK了,至于怎么算是否在端点两侧还是用到上面的叉乘公式,两个端点的结果的积为负数,则在两侧,当然这里有种特殊情况需要处理,就是叉乘等于零,也就是端点在线段的延伸线上,所以这里需要判断这个端点是否在另一条线段上就OK了...这个代码没有注释,给以后的我自己看的...

#include

#include

#include

using namespace std;

struct point

{

int x;

int y;

}p[5];

int fff(point a,point b,point c)

{

point p1,p2;

p1.x=a.x-c.x;

p1.y=a.y-c.y;

p2.x=b.x-c.x;

p2.y=b.y-c.y;

return (p1.x*p2.y-p1.y*p2.x);

}

int ffff(point a,point b,point c)

{

point min,max;

min.x=b.x;min.y=b.y;max.x=a.x;max.y=a.y;

if (a.x

{

min.x=a.x;

max.x=b.x;

}

if (a.y

{

min.y=a.y;

max.y=b.y;

}

if (c.x>=min.x && c.x<=max.x && c.y>=min.y && c.y<=max.y) return 1;

else return 0;

}

int ff(point a,point b,point c,point d)

{

int q,w,e,r;

q=fff(a,b,c);

w=fff(a,b,d);

e=fff(c,d,a);

r=fff(c,d,b);

if (q*w<0 && e*r<0)

return 1;

else

{

if (q==0 && ffff(a,b,c)) return 1;

if (w==0 && ffff(a,b,d)) return 1;

if (e==0 && ffff(c,d,a)) return 1;

if (r==0 && ffff(c,d,b)) return 1;

}

return 0;

}

int main()

{

while (~scanf("%d%d%d%d%d%d%d%d",&p[0].x,&p[0].y,&p[1].x,&p[1].y,&p[2].x,&p[2].y,&p[3].x,&p[3].y))

{

if (ff(p[0],p[1],p[2],p[3])) printf("相交\n");

else printf("不相交\n");

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值