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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章