我在C ++中有以下功能,应该使用Heron公式找到三角形的区域。我没有在数学上犯过任何错误,但它没有产生正确的结果!我看了它超过3个小时,我找不到任何错误。我错过了什么?
float TriangleArea(float x0, float y0, float x1, float y1, float x2, float y2)
{
float area_triangle;
float a, b, c, s;
a=std::sqrt((x0-x1)*(x0-x1)-(y0-y1)*(y0-y1));
b=std::sqrt((x1-x2)*(x1-x2)-(y1-y2)*(y1-y2));
c=std::sqrt((x0-x2)*(x0-x2)-(y0-y2)*(y0-y2));
s=(a+b+c)/2;
area_triangle=std::sqrt((s*(s-a)*(s-b)*(s-c)));
return area_triangle;
}
答案 0 :(得分:8)
我没有在数学上犯任何错误,但它没有产生正确的结果!
如果它没有产生正确的结果,那么我认为你在数学上犯错很可能。
a=std::sqrt((x0-x1)*(x0-x1)-(y0-y1)*(y0-y1));
-
看起来很可疑。我假设您正在尝试找到(x0, y0)
和(x1, y1)
之间的距离。如果是这种情况,您应该添加两个数量,而不是减去。
我不熟悉苍鹭的公式,但是you can use this simpler formula:
area = std::abs(x0 * (y1 - y2) + x1 * (y2 - y0) + x2 * (y0 - y1)) / 2;
修改:我忘记提及Antonio指出的简化公式的abs
函数。
答案 1 :(得分:3)
我认为你有一个标志错误。值a,b和c是三角形边,对吗?
a=std::sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1));
^
答案 2 :(得分:2)
可以找到替代公式(带演示)here
area = fabs((x0 - x2) * (y1 - y0) - (x0 - x1) * (y2 - y0) ) / 2;
(作为旁注,如果公式必须用于测试点共线性,则可以删除绝对值...但是无论如何你可能还需要它,因为使用浮点你不能测试相等但是对某些epsilon值)