突破口:求两线段是否有交点,只要求出两线段所在直线之间的交点(x,y),问x1<=x<=x1’&&x2<=x<=x2’即可。
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct segent //线段两端点的坐标
{
double x1,y1,x2,y2;
}s[105];
double k[105],b[105]; //y=kx+b,记录每条线段所在直线的斜率还有截距
int main()
{
int n,i,j,cnt;
double x1,y1,x2,y2;
double x;
while(~scanf("%d",&n)&&n)
{
cnt=0;
for(i=0;i<=n-1;i++)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
if(x1>x2) //始终保证x1<=x2,即(x1,y1)始终为线段的左端点
{
swap(x1,x2);
swap(y1,y2);
}
s[i].x1=x1;s[i].y1=y1;s[i].x2=x2;s[i].y2=y2;
k[i]=(s[i].y1-s[i].y2)/(s[i].x1-s[i].x2);
b[i]=s[i].y1-k[i]*s[i].x1;
}
for(i=0;i<=n-1;i++)
{
for(j=i+1;j<=n-1;j++)
{
if(k[i]!=k[j]) //不平行,两直线必有交点
{
x=(b[j]-b[i])/(k[i]-k[j]); //求出交点横坐标
if(x>=s[i].x1&&x<=s[i].x2&&x>=s[j].x1&&x<=s[j].x2)
cnt++;
}
}
}
printf("%d\n",cnt);
}
return 0;
}