题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086
题目大意:给出n条线段,求一共有多少个交点,忽略相交于同一点。
解题思路:设有线段AB,CD
判断AB和CD知否有交点:(同时满足,*表示叉乘)
1.C点和D点分别在AB的两侧 ---> 向量(AB*AC)*(AB*AD)<=0
2.A点和 B点分别在CD的两侧 ---> 向量(CD*CA)*(CD*CB)<=0
2.A点和 B点分别在CD的两侧 ---> 向量(CD*CA)*(CD*CB)<=0
代码:
#include<iostream>
#include<cstdio>
using namespace std;
#define N 210
typedef struct{
double x,y;
}Point;
Point p[N];
///叉乘
double Judge(double x1,double y1,double x2,double y2){
return (x1*y2-x2*y1);
}
int main(){
int n;
while(scanf("%d",&n)&&n)
{
int ans=0;
if(n==1) ;
else{
for(int i=0;i<2*n;i+=2){
scanf("%lf%lf%lf%lf",&p[i].x,&p[i].y,&p[i+1].x,&p[i+1].y);
}
for(int i=0;i<2*n;i+=2){
for(int j=i+2;j<2*n;j+=2){
if( ( Judge(p[i+1].x-p[i].x, p[i+1].y-p[i].y, p[j].x-p[i].x, p[j].y-p[i].y) * Judge(p[i+1].x-p[i].x, p[i+1].y-p[i].y, p[j+1].x-p[i].x, p[j+1].y-p[i].y) )<=0.0 ){
if( ( Judge(p[j+1].x-p[j].x, p[j+1].y-p[j].y, p[i].x-p[j].x, p[i].y-p[j].y) * Judge(p[j+1].x-p[j].x, p[j+1].y-p[j].y, p[i+1].x-p[j].x, p[i+1].y-p[j].y) ) <=0.0 )
ans++;
}
}
}
}
printf("%d\n",ans);
}
return 0;
}