UVA Orchard Trees(计算几何)

来源:互联网 发布:地图填色软件 编辑:程序博客网 时间:2024/06/13 01:52

求给定浮点三角形中的整点个数,包括边界上面的,开始以为又是什么转化的PICK定理,后来发现点的范围很小,所以直接暴力枚举每个点

判断在不在三角形内部,判断直接用面积判断

可能会导致wa的地方是三角形可能会退化成一条直线,那么在共线的点无论在不在三角形状内部都符合,所以这里要加一个判断

#include <iostream>#include <string.h>#include <algorithm>#include <cmath>#include <stdio.h>using namespace std;#define eps 1e-8#define zero(x) (fabs(x)<eps?1:0)#define MAX(a,b) (a>b?a:b)#define MIN(a,b) (a<b?a:b)struct point{    double x,y;}a,b,c,temp;double area;double cross(point &a,point &b,point &c){    return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);}bool is_ok(point &temp){    double ans=0;    ans+=fabs(cross(temp,a,b));    ans+=fabs(cross(temp,b,c));    ans+=fabs(cross(temp,a,c));    if(!zero(ans-area)) return false;    if(zero(area)){        return (temp.x>=MIN(a.x,b.x) && temp.x<=MAX(a.x,b.x)) ||         (temp.x>=MIN(b.x,c.x) && temp.x<=MAX(b.x,c.x))||          (temp.x>=MIN(a.x,c.x) && temp.x<=MAX(a.x,c.x));    }    return zero(ans-area);}int main(){    int i,j,k,ans;    while(scanf("%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y)){        if(a.x==0 && b.x==0 && c.x==0 && a.y==0 && b.y==0 && c.y==0)        return 0;        ans=0;        area=fabs(cross(a,b,c));        for(i=1;i<100;i++)        for(j=1;j<100;j++){            temp.x=i,temp.y=j;            if(is_ok(temp)){                ans++;            }        }        printf("%4d\n",ans);    }    return 0;}


原创粉丝点击