2011-03-17 45 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添加另一个值。