2017-07-30 101 views
1

比方說,我用下面的代碼來創建一個六邊形的多邊形頂點:如何創建一個多邊形時頂點之間添加n個點

hexagonPoints = new Array<Vector2>(); 
for (int a = 0; a < 6; a++) 
{ 
    float x = r * (float)Math.cos(a * 60 * Math.PI/180f); 
    float y = r * (float)Math.sin(a * 60 * Math.PI/180f); 
    hexagonPoints.add(new Vector2(x, y)); 
} 

我怎麼能沿的每一側增加額外的點多邊形,所以每個連接的頂點集之間有n個附加點?所有頂點必須等距離(包括形成初始形狀的頂點)。例如。前:

. . 

. . 

後(其中n = 1):

. . . 
. . 
. . . 

編輯:這裏是根據沃爾克的建議,我當前的代碼:

float r = 3.0f; 
int n = 1 + 2; // number of additional vertices between the main shape vertices 
for (int a = 0; a < 6; a++) 
{ 
    float xe = r * (float)Math.cos(a * 60 * Math.PI/180f); 
    float ye = r * (float)Math.sin(a * 60 * Math.PI/180f); 

    if (a > 0) 
    { 
     for (int i = 1; i < n; ++i) 
     { 
      float xs = ((n - i) * hexagonPoints.get(a - 1).x + i * xe)/n; 
      float ys = ((n - i) * hexagonPoints.get(a - 1).y + i * ye)/n; 
      hexagonPoints.add(new Vector2(xs, ys)); 
     } 
    } 

    hexagonPoints.add(new Vector2(xe, ye)); 
} 

該地塊的附加頂點,但他們不在正確的位置。

編輯:似乎這是行不通的,因爲我沒有考慮到第一個頂點的位置。

回答

3

計算每一邊的端點,因爲你已經在做它了。然後引入一個內部循環附加的分裂點。

for (int i=1; i<n: ++i) 
{ 
    float xs = ((n-i)*xb + i*xe)/n; 
    float ys = ((n-i)*yb + i*ye)/n; 
    hexagonPoints.add(new Vector(xs, ys)); 
} 
hexagonPoints.add(new Vector(xe, ye)); 

其中xb,yb是六邊形的開始,xe,ye是結束。

+1

尼斯。 @lepton注意到Volker的代碼中的'n'應該等於頂點之間所需的段數,即1 +額外點的數量(認爲圍欄和圍欄帖子) – SirRaffleBuffle

+0

謝謝你們。我添加了Volker建議的內部循環(請參閱已編輯的OP),但額外的頂點未被繪製在正確的位置,它們被繪製在六邊形內而不是主頂點之間。任何想法,我要去錯了嗎? – lepton

+0

當您將xe,ye添加到hexagonPoints時,您必須切換到下一行的開頭,即x = xe; y = ye; – milbrandt

1

這裏是一個有效的解決方案,根據沃爾克的建議:

int size = 6; 
int npoints = 2; 
int nsegs = npoints + 1; 

float xb = r; 
float yb = 0; 
hexagonPoints.add(new Vector2(xb, yb)); 

for (int a = 1; a <= size; a++) 
{ 
    float xe = r * (float) Math.cos(a * 60 * Math.PI/180f); 
    float ye = r * (float) Math.sin(a * 60 * Math.PI/180f); 

    for (int i = 1; i < nsegs; ++i) 
    { 
     float xs = ((nsegs - i) * xb + i * xe)/nsegs; 
     float ys = ((nsegs - i) * yb + i * ye)/nsegs; 
     hexagonPoints.add(new Vector2(xs, ys)); 
    } 

    if (a < size) hexagonPoints.add(new Vector2(xe, ye)); 
    xb = xe; 
    yb = ye; 
} 
+0

謝謝,現在就開始工作。看起來我沒有工作,因爲我沒有正確設置第一個起點。您需要在代碼中將<6改爲<7,但是要繪製所有六面。 – lepton

+0

不客氣。對於六邊形來說,<6是正確的,因爲我們在循環開始之前添加第一個點(其中a == 0)。設置<7會生成重複的點。 – SirRaffleBuffle

+0

儘管如此,它並沒有繪出所有額外的頂點:http://imgur.com/LG7spnw – lepton

相關問題