2016-02-27 328 views
0

我在學校有一個程序,我必須告訴大家它在做什麼。我得到的程序是計算面積和多邊形質心的程序。現在,我幾乎知道所有事情,但是在計劃中有兩個數字,我什麼都不能做。 -10001和-47。如果我替換它們,程序不會使計算正確。你能告訴我爲什麼-10001和47?如果我不是加-10001和-47的caculating是正確的..面積和多邊形的質心

#include <stdio.h> 

#include <math.h> 

typedef struct 
{ 
    double x,y; 
} POINT; 

POINT c, o, p[10000]; 

double a, q=0.0; 

int n; 

double ccw(POINT a, POINT b, POINT c) 
{ 
    return a.x*b.y + a.y*c.x + b.x*c.y - c.x*b.y - b.x*a.y - c.y*a.x; 
} 

int main(void) 
{ 

    int i, j; 

    o.x=-10001; 
    o.y=-47; 
    **/* THIS IS WHAT*/** 
    while (scanf("%d", &n) > 0) 
    { 
     if(!n) 
      break; 
     for (i = 0; i < n; i++) 
      scanf("%lf %lf", &p[i].x, &p[i].y); 
     a=0; 
     for(i=0; i<n; i++) 
      a += ccw(o, p[i], p[(i+1)%n]); 

     c.x = c.y = 0.0; 
     for(i=0; i<n; i++) 
     { 
      q = ccw(o, p[i], p[(i+1)%n])/(3.0*a); 
      c.x += q*(o.x + p[i].x + p[(i+1)%n].x); 
      c.y += q*(o.y + p[i].y + p[(i+1)%n].y); 
     } 

     printf("%.3lf\n", fabs(a)/2.0); 
     printf("%.3lf %.3lf\n", c.x, c.y); 

     return 0; 
    } 
} 
+0

它是C還是C++?它不能兼而有之。 –

+0

@PreferenceBean它是C. –

+2

那麼你爲什麼使用C++標籤! –

回答

1

o只是一個任意的參考點。您可以添加由多邊形的每個邊和該點組成的三角形。由於該區域具有符號,因此clockwisde和anticlockwise三角形將互相消除。這一點可能在於任何地方;它甚至可能是多邊形的頂點之一。

下圖顯示了三角形如何具有不同的權重:三角形23o是順時針方向,對面積有正面貢獻;三角形05o是逆時針方向並具有負面影響。很容易看出正三角形區域和負三角形區域的區別在於多邊形區域。

calculating the area of a polygon by summing traingle areas

三角形的面積經由每個三角形的兩條邊,(b - a) × (c - b)的叉積計算。結果矢量的絕對值是由兩個矢量創建的平行四邊形的面積。 x,y平面中兩個矢量的叉積只有一個z組件。取決於組件的正面或負面的周長感。

如果參考點遠離三角形,浮點求和可能會導致不準確,特別是在計算三角形的中心點時。 (請試着用{1.0e+12, 1.0e+12}這個參考點。)

因此,將第一個頂點作爲參考點是個好主意。那麼你也可以離開了第一和最後一段,因爲他們是退化三角形,不利於該地區或中心:

a = 0; 
    for(i = 2; i < n; i++) { 
     a += ccw(p[0], p[i - 1], p[i]); 
    } 

    c.x = c.y = 0.0; 
    for(i = 2; i < n; i++) { 
     q = ccw(p[0], p[i - 1], p[i])/(3.0 * a); 

     c.x += q*(p[0].x + p[i - 1].x + p[i].x); 
     c.y += q*(p[0].y + p[i - 1].y + p[i].y); 
    } 

這也將擺脫需要包裝的索引。

+0

你可以幫助我的數學嗎?我在維基百科找到了一個公式。 https://upload.wikimedia.org/math/a/4/c/a4cee81a1d18e4d067f66d4d40a8a1fe.png 它適用於三角形,但對於多邊形,它沒有。我必須向其他人展示它的數學,但結果與我在程序中獲得的結果不同。如果我把它做成一個三角形,結果就像我得到的結果一樣。 –

+0

我已經擴展了答案。圖像顯示了多邊形的面積是如何通過添加具有「遠」邊的三角形並減去「近」邊來組成的。函數'ccw'計算一個叉積,它描述了矢量之間平行四邊形的面積;因此除以2.所計算的重心是權重是三角形面積的三角形中心的加權平均值。 –

+0

非常感謝!現在我明白了! –

相關問題