2015-03-31 156 views
0

我在C++中有以下函数,它应该用Heron公式找到三角形的面积。我没有犯数学错误,但没有产生正确的结果!我看了3个多小时,我找不到任何错误。我错过了什么?计算三角形面积的C++函数

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; 

} 
+5

请提供样本输入,预期输出和实际输出。 – 2015-03-31 19:00:34

+0

任何子表达式都已经错了吗? – 2015-03-31 19:00:58

+1

'我看了3个多小时'然后打印出'a','b'和'c'的每一个值,并计算semiperimeter's'并查看哪个不正确。写入3或4个'printf()'或'cout'行不需要3个小时。 – PaulMcKenzie 2015-03-31 19:10:20

回答

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

看着苍鹭的公式,他确实计算了双方的长度,这意味着它应该是'+'而不是'-' – SirGuy 2015-03-31 19:07:12

+0

你是对的!我甚至没有意识到我使用过“ - ”,因为它非常基本,我在寻找公式中的错误。谢谢! – Adam 2015-03-31 19:10:18

+0

作为一个侧面说明,你的公式也可以用来检查3个点是否共线(该面积原来是零) – Antonio 2015-03-31 19:10:22

3

我认为你有一个标志错误。值a,b和c是三角形的边,对吗?

a=std::sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1)); 
         ^
+0

非常感谢,你是对的!我不得不接受另一个答案,因为它是第一个,并提供了额外的信息。 – Adam 2015-03-31 19:12:34

2

另一种式(与示范)可以发现here

area = fabs((x0 - x2) * (y1 - y0) - (x0 - x1) * (y2 - y0))/2; 

(作为边注,如果公式必须被用来测试点共线,绝对值可以被移除。 ..但是,无论如何,你可能需要它,因为使用浮点数,你不能测试相等性,但对一些ε值)

+0

非常有帮助,谢谢! – Adam 2015-03-31 19:35:05