就是计算交点嘛,就是个判断两点是否在两线旁边,开始把点写成int了,wa了2次....因为是第一个自己写的完整的计算几何,所以丢上来了,话说xmult函数的作用真心强~
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <math.h>
using namespace std;
struct point{
double x,y;
};
point point1[101],point2[101];
double xmult(point p1,point p2,point p3)
{
return (p1.x-p3.x)*(p2.y-p3.y)-(p1.y-p3.y)*(p2.x-p3.x);
}
bool online(point p1,point p2,point p3)
{
return (p3.x>=min(p1.x,p2.x)&&p3.x<=max(p1.x,p2.x));
}
bool solve(point p1,point p2,point p3,point p4)
{
double d1,d2,d3,d4;
d1=xmult(p1,p2,p3);
d2=xmult(p1,p2,p4);
d3=xmult(p3,p4,p1);
d4=xmult(p3,p4,p2);
if (d1*d2<0&&d3*d4<0)
return 1;
if (d1==0) return online(p1,p2,p3);
if (d2==0) return online(p1,p2,p4);
if (d3==0) return online(p3,p4,p1);
if (d4==0) return online(p3,p4,p2);
return 0;
}
int main()
{
int i,j,t,n,sum;
while(scanf("%d",&n)!=EOF&&n)
{
sum=0;
for (i=0;i<n;i++)
scanf("%lf%lf%lf%lf",&point1[i].x,&point1[i].y,&point2[i].x,&point2[i].y);
for (i=0;i<n;i++)
{
for (j=i+1;j<n;j++)
if (solve(point1[i],point2[i],point1[j],point2[j]))
sum++;
}
printf("%d\n",sum);
}
}