2015-03-31 149 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