Give you N (1<=N<=100) segments(线段), please output the number of all intersections(交点). You should count repeatedly if M (M>2) segments intersect at the same point.
Note:
You can assume that two segments would not intersect at more than one point.
A test case starting with 0 terminates the input and this test case is not to be processed.
2 0.00 0.00 1.00 1.00 0.00 1.00 1.00 0.00 3 0.00 0.00 1.00 1.00 0.00 1.00 1.00 0.000 0.00 0.00 1.00 0.00 0
1 3
lcy
判断两线段AB,CD相交的方法
1、判断A和B在CD两侧
2、判断C和D在AB两侧
主要利用ACxAB*ADxAB<=0
CAxCD*CBxCD<=0
(其中x表示两个向量的叉乘,*表示普通的乘法)
具体的关于计算几何的问题可以参考
http://dev.gameres.com/Program/Abstract/Geometry.htm#
下面是代码
#include<iostream>
using namespace std;
struct node
{
double x1,y1,x2,y2;
};
double cross(double x1,double y1,double x2,double y2)
{
return x1*y2-x2*y1;
}
int main()
{
int n;
node p[110];
while(cin>>n&&n!=0)
{
int i,j,ans=0;
for(i=0;i<n;i++)
cin>>p[i].x1>>p[i].y1>>p[i].x2>>p[i].y2;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if((cross(p[j].x1-p[i].x1,p[j].y1-p[i].y1,p[j].x2-p[j].x1,p[j].y2-p[j].y1))*cross(p[j].x1-p[i].x2,p[j].y1-p[i].y2,p[j].x2-p[j].x1,p[j].y2-p[j].y1)<=0)
{
if((cross(p[j].x1-p[i].x1,p[j].y1-p[i].y1,p[i].x2-p[i].x1,p[i].y2-p[i].y1))*cross(p[j].x2-p[i].x1,p[j].y2-p[i].y1,p[i].x2-p[i].x1,p[i].y2-p[i].y1)<=0)
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}