模板--判断两条线段是否相交--计算几何

模板--判断两条线段是否相交--计算几何;

1.两个结构体表示的是该条线段的A,B两个端点;

const int maxa=1e2+10;
const double pi=0.00000001;
struct nodea{
	int x,y;
}a[maxa];
struct nodeb{
	int x,y;
}b[maxa];
bool check(nodea a,nodeb b,nodea c,nodeb d){
    if(!(min(a.x,b.x)<=max(c.x,d.x)
	&&min(c.y,d.y)<=max(a.y,b.y)
	&&min(c.x,d.x)<=max(a.x,b.x)
	&&min(a.y,b.y)<=max(c.y,d.y)))	return false; 
    double u,v,w,z;
    u=(c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y);
    v=(d.x-a.x)*(b.y-a.y)-(b.x-a.x)*(d.y-a.y);
    w=(a.x-c.x)*(d.y-c.y)-(d.x-c.x)*(a.y-c.y);
    z=(b.x-c.x)*(d.y-c.y)-(d.x-c.x)*(b.y-c.y);
    return (u*v<=pi&&w*z<=pi);
}

2.一个结构体表示的是该条线段的A,B两个端点,用于判断线段A,B是否相交;

const int maxa=1e2+10;
const double pi=1e-8;
const int inf=0x3f3f3f3f;
int n;
struct node{
	int x1,y1;
	int x2,y2;
}a[maxa];
bool check(node &a,node &b){
	if(!(min(a.x1,a.x2)<=max(b.x1,b.x2)
	&&min(b.y1,b.y2)<=max(a.y1,a.y2)
	&&min(b.x1,b.x2)<=max(a.x1,a.x2)
	&&min(a.y1,a.y2)<=max(b.y1,b.y2)))	return false;
	double u,v,w,z;
    u=(b.x1-a.x1)*(a.y2-a.y1)-(a.x2-a.x1)*(b.y1-a.y1);
    v=(b.x2-a.x1)*(a.y2-a.y1)-(a.x2-a.x1)*(b.y2-a.y1);
    w=(a.x1-b.x1)*(b.y2-b.y1)-(b.x2-b.x1)*(a.y1-b.y1);
    z=(a.x2-b.x1)*(b.y2-b.y1)-(b.x2-b.x1)*(a.y2-b.y1);
    return (u*v<=pi&&w*z<=pi);
}

题目链接:

传送门ZOJ--1648

传送门UVA--191

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值