2011-03-17 44 views
2

我有一個構成2D多邊形的位置頂點數組。翻轉頂點陣列

 Vector2[] _chassisConcaveVertices = 
     { 
      new Vector2(5.122f, 0.572f), 
      new Vector2(3.518f, 0.572f), 
      new Vector2(3.458f, 0.169f), 
      new Vector2(2.553f, 0.169f), 
      new Vector2(2.013f, 0.414f), 
      new Vector2(0.992f, 0.769f), 
      new Vector2(0.992f, 1.363f), 
      new Vector2(5.122f, 1.363f), 
     }; 

可以使用什麼算法修改位置,以便合成多邊形翻轉?我需要水平和垂直翻轉多邊形。

+0

您還可以添加一個示例輸入和輸出,以便每個人都具有**垂直和水平翻轉**操作的具體想法。 – 2011-03-17 07:38:46

+1

你在空間的什麼地方翻轉? (0.0f,0.0f)還是別的? – quasiverse 2011-03-17 07:47:51

回答

1

如果你翻轉點(0.0f,0.0f),你只需要否定這些值。所以,你的形狀是:

Vector2[] _chassisConcaveVertices = 
    { 
     new Vector2(-5.122f, -0.572f), 
     new Vector2(-3.518f, -0.572f), 
     new Vector2(-3.458f, -0.169f), 
     new Vector2(-2.553f, -0.169f), 
     new Vector2(-2.013f, -0.414f), 
     new Vector2(-0.992f, -0.769f), 
     new Vector2(-0.992f, -1.363f), 
     new Vector2(-5.122f, -1.363f), 
    }; 

如果你是圍繞一個點(X,Y),那麼每一個點爲(X - (PX - X))翻轉或(2 * xp.x)爲X值和(y - (py - y))或(2 * yp.y)。

這解釋爲:
。是要翻轉
*點是要前後翻頁 澳點要與

x axis 
    ^
    | 
    . - 
    | | <- 
    | | <- Let this be distance a 
    * - 
    | | <- 
    | | <- This should be equal to a 
    O - 
    | 
    | 
    -------> y axis 

結束了假設的x值的點。 *和O分別是t,m和b(頂部,中部和底部)。正如你所看到的,距離a = t-m和b = m-a。因此B = M-(TM)= M-T + M = M * 2-T

然後你可以使用這個原則來寫一個算法來前後翻頁不同角度的所有點,這會給你翻轉多邊形!

0

不確定是否有「正確」的方式,但類似下面的內容應該可以在水平和垂直方向上翻轉多邊形。

  1. 通過添加平均x點和y點來尋找中心點。
  2. 對於多邊形中的每個點,計算距離中心點的垂直距離和水平距離,並將每個值加倍到該點。

未測試例如:

Vector2[] _chassisConcaveVertices = 
    { 
     new Vector2(5.122f, 0.572f), 
     new Vector2(3.518f, 0.572f), 
     new Vector2(3.458f, 0.169f), 
     new Vector2(2.553f, 0.169f), 
     new Vector2(2.013f, 0.414f), 
     new Vector2(0.992f, 0.769f), 
     new Vector2(0.992f, 1.363f), 
     new Vector2(5.122f, 1.363f), 
    }; 

    // find center 
    float sumX = 0; 
    float sumY = 0; 
    foreach (var vector in _chassisConcaveVertices) 
    { 
     sumX += vector.X; 
     sumY += vector.Y; 
    } 
    Vector2 center = new Vector2(
     sumX/_chassisConcaveVertices.Length, 
     sumY/_chassisConcaveVertices.Length); 

    // create a new version of the polygon flipped 
    Vector2[] flipped = _chassisConcaveVertices 
     .Select(v => new Vector2(
      v.X + (center.X - v.X) * 2, 
      v.Y + (center.Y - v.Y) * 2)) 
     .ToArray(); 
0

首先,你必須採取內接的多邊形的圓周的中心,然後採取跨過中心出現垂直和horitzontal線,對於每一個點,首先,在垂直線的另一側取對稱,然後重複在水平線另一側的對稱點的動作,你將有所有的點翻轉。

見你!

3

假設Vector2類有兩個屬性/成員名稱xy

public Vector2[] FlipHorizontally(Vector2[] original) 
    { 
     Vector2[] flipped = new Vector2[original.Length]; 
     for (int i = 0; i < original.Length; i++) 
     { 
      flipped[i] = new Vector2(-1 * original[i].x, original[i].y); 
     } 
     return flipped; 
    } 

    public Vector2[] FlipVertically(Vector2[] original) 
    { 
     Vector2[] flipped = new Vector2[original.Length]; 
     for (int i = 0; i < original.Length; i++) 
     { 
      flipped[i] = new Vector2(original[i].x, -1 * original[i].y); 
     } 
     return flipped; 
    } 

這將翻轉的頂點相對於所述兩個軸。您沒有指定您打算爲新多邊形定位的原始位置。如果你需要「移動」它,那麼你只需要爲所有的x添加一個值,並且爲所有的y添加另一個值。