天天写算法之You can Solve a Geometry Problem too

这个题目,依旧使用了cha乘,逆时针的性质,判断两个线段是否相交,在这个地方,只需要判断对于其中任意一个线段,另一个线段的chacheng都为非正数,这里就可以得到两个线段相交了。

代码:

#include<iostream>
#include<string.h>
#include<cstdio>
#include<cmath>
#define MAX 105
using namespace std;

struct point{
    double x ;
    double y ;
};
struct line{
 point from;
 point to ;
}A[MAX];

double product(point a , point b , point c)
{
        double x1,y1,x2,y2;
        x1 = a.x-c.x,y1= a.y-c.y;
        x2 = b.x-c.x,y2= b.y-c.y;
        return x1*y2-y1*x2;
}
//首先题目中说明了,你不会重叠
//这个地方一定要注意《0,因为当两个点正好端点相交,那么就是《0的情况
bool judge(line a ,line b)
{
    return product(a.from,a.to,b.from)*product(a.from,a.to,b.to)<=0&&product(b.from,b.to,a.from)*product(b.from,b.to,a.to)<=0;
}

int main(){
    int n ,i,j,k,ans;
    while(scanf("%d",&n),n)
    {
        for(int i = 0 ; i < n ; i ++ )
        {
            scanf("%lf%lf%lf%lf",&A[i].from.x,&A[i].from.y,&A[i].to.x,&A[i].to.y);
        }
        ans = 0 ;
        for(int i = 0 ; i<n ; i++)
        {
            for(int j = i+1;j<n;j++)
            {
                if(judge(A[i],A[j])) ans++;
            }
        }
        printf("%d\n",ans);
    }
}

阅读更多

没有更多推荐了,返回首页