任务 - 指向三角形内部或外部。我查看了苍鹭的小三角形公式和大三角公式。然后比较他们的总和。很可能是“区域”功能中的错误。
#include <iostream>
#include <math.h>
using namespace std;
struct point
{
int x;
int y;
};
double length(point first, point second)
{
double katet1=second.x-first.x;
double katet2=second.y-first.y;
return(sqrt(katet1*katet1+katet2*katet2));
}
double area(point a, point b, point c)
{
double ab = length(a,b);
double bc = length(b,c);
double ca = length(c,a);
double p =(ab+bc+ca)/2;
double s = sqrt(p*(p-ab)*(p-bc)*(p-ca));
return(s);
}
int main()
{
int num;
cin>>num;
int win=0;
for(int i=0; i<num; i++)
{
point d,a,b,c;
cin>>d.x>>d.y>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y;
double s1,s2,s3,s4;
s1=area(d,a,b);
s2=area(d,b,c);
s3=area(d,a,c);
s4=area(a,b,c);
if((s1+s2+s3)==s4)
win++;
}
cout<<win;
cin.get();
}
未通过所有测试。 例如,测试1 1 1 0 0 2 2 0 3必须返回1但返回0。 怎么了? 对不起我的英文不好。
答案 0 :(得分:3)
您正在尝试将double与operator ==进行比较 计算结果可能不同,您需要使用epsilon值作为错误边际:
const double Epsilon = 0.0001;
if (((s1+s2+s3) >= s4 - Epsilon) && ((s1+s2+s3) <= s4 + Epsilon))
{
}
答案 1 :(得分:1)
您不应期望(s1+s2+s3) == s4
double/float
在计算机世界中正常工作。尝试:
abs(s1 + s2 + s3 - s4) < Epsilon
其中Epsilon是您所需的精度,例如根据您的应用将其设置为0.00001
,0.01
,1.0
,甚至超过10.0
。
-
"What Every Computer Scientist Should Know About Floating-Point Arithmetic"