您的位置:首页 > 其它

UVA Orchard Trees(计算几何)

2013-10-13 21:48 459 查看
求给定浮点三角形中的整点个数,包括边界上面的,开始以为又是什么转化的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HUST