2017-07-30 8 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つの辺すべてをプロットするには、コード内で<6からa <7に変更する必要があります。 – lepton

+0

ようこそ。ループの開始前に最初の点(a == 0)を追加するので、a <6は正しいです。 a <7を設定すると重複した点が生成されます。 – SirRaffleBuffle

+0

6では、余分な頂点をすべてプロットしません:http://imgur.com/LG7spnw – lepton

関連する問題