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