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

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值