来源:http://acm.hdu.edu.cn/showproblem.php?pid=1086
有两种思路
1.求出某一直线的方程式,将另一线段两端点代入判断正负。
2.叉乘的思想
这里用的是叉乘的方法(写这个得细心些)
代码如下
#include<stdio.h>
#include<string>
#include<math.h>
#include<iostream>
using namespace std;
#define Max 0x7ffffff
double Max1(double a,double b)
{
a=(a>b)?a:b;
return a ;
}
double Min1(double a,double b)
{
a=(a<b)?a:b;
return a ;
}
struct point
{
double x,y;
};
struct line
{
point a,b;
};
double xmulti(point a1,point a2,point a3)
{
return (a1.x-a3.x)*(a2.y-a3.y)-(a1.y-a3.y)*(a2.x-a3.x);
}
int judge(line l1,line l2)
{
if(Max1(l1.a.x,l1.b.x)>=Min1(l2.a.x,l2.b.x)&&Max1(l1.a.y,l1.b.y)>=Min1(l2.a.y,l2.b.y)
&&Max1(l2.a.x,l2.b.x)>=Min1(l1.a.x,l1.b.x)&&Max1(l2.a.y,l2.b.y)>=Min1(l1.a.y,l1.b.y)
&&xmulti(l1.a,l2.b,l2.a)*xmulti(l1.b,l2.b,l2.a)<=0&&
xmulti(l2.a,l1.b,l1.a)*xmulti(l2.b,l1.b,l1.a)<=0)
return 1;
return 0;
}
int main()
{
int n,i,j,cnt;
line l[101];
while(~scanf("%d",&n)&&n)
{
for(i=0;i<n;i++)
{
scanf("%lf%lf%lf%lf",&l[i].a.x,&l[i].a.y,&l[i].b.x,&l[i].b.y);
}
cnt=0;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if(judge(l[i],l[j]))cnt++;
}
printf("%d\n",cnt);
}
return 0;
}