//hdu 1086 You can Solve a Geometry Problem too(几何(线段相交))
/*
由(p3-p1)^(p2-p1)确定p1p3在p1p2的哪个方向;由(p4-p1)^(p2-p1)确定p1p4在p1p2的哪个方向
1、若是两个叉积正负号相同,都在p1p2的同边,说明p3p4不跨立p1p2所在的直线;
2、若是两个叉积正负号相同,分别在p1p2的异边,说明p3p4跨立p1p2所在的直线;
3、若是两个叉积有一个为0,都在p1p2的同边,说明p3p4跨立p1p2所在的直线。
*/
#include<iostream>
#include<cstdio>
using namespace std;
const int N=110;
struct point
{
double x;
double y;
};
struct Line
{
point p1;
point p2;
}L[N];
point subpoint(point p1,point p2)
{
point p;
p.x=p1.x-p2.x;
p.y=p1.y-p2.y;
return p;
}
double Cross(point p,Line l)
{
point p1=subpoint(p,l.p1);
point p2=subpoint(l.p2,l.p1);
return p1.x*p2.y-p1.y*p2.x;
}
bool jidu(double flag)
{
if(flag<1e-8&&flag>-(1e-8))
{
return true;
}
return false;
}
int Lineintersection(Line l1,Line l2)
{
double flag1=Cross(l2.p1,l1);
double flag2=Cross(l2.p2,l1);
if(jidu(flag1)||jidu(flag2))
{
return 2;
}
if(flag1*flag2<0)
{
return 1;
}
return 0;
}
int main()
{
int n;
int ans=0;
while(~scanf("%d",&n))
{
if(n==0) break;
ans=0;
for(int i=1;i<=n;i++)
{
scanf("%lf%lf%lf%lf",&L[i].p1.x,&L[i].p1.y,&L[i].p2.x,&L[i].p2.y);
}
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(Lineintersection(L[i],L[j])==2)
{
ans++;
}
else if(Lineintersection(L[i],L[j])==1&&Lineintersection(L[j],L[i])!=0)
{
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}
hdu 1086 You can Solve a Geometry Problem too(几何(线段相交))
最新推荐文章于 2020-05-05 01:59:54 发布