翻转顶点阵列

时间:2011-03-17 07:35:36

标签: c# algorithm flip vertex

我有一组构成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),
        };

我可以使用什么算法来修改位置,以便翻转结果多边形?我需要水平和垂直翻转多边形。

5 个答案:

答案 0 :(得分:4)

假设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添加另一个值。

答案 1 :(得分: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值和(y - (py - y)的每个点都是(x - (px - x))或(2 * xp.x) )或(2 * yp.y)表示y值。

这解释了:
。是你要翻转的点 *是你要翻转的点 O是你想要的结果

  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-(t-m)= m-t + m = m * 2-t

然后你可以使用这个原理编写一个算法来翻转不同点周围的所有点,这将为你提供翻转的多边形!

答案 2 :(得分:0)

不确定是否有“正确”的方法,但是类似下面的内容应该可以在水平和垂直方向上翻转多边形。

  1. 通过添加平均x点和y点来找到中心点。
  2. 对于多边形中的每个点,计算距中心点的垂直和水平距离,并将每个值加倍到该点。
  3. 未经测试的例子:

        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();
    

答案 3 :(得分:0)

首先你必须取圆角的中心来刻划多边形,然后沿着垂直和水平线穿过中心,对于每个点,首先,在垂直线的另一侧取对称,然后在horitzontal的另一侧重复对称点的动作,你将全部翻转。

见到你!

答案 4 :(得分:0)

水平翻转的测试示例。 支持对撞机中的多个路径: 这些路径是相对于对撞机中心位置镜像的。

void FlipHorizontally(PolygonCollider2D tpolygon)
{
    // find centre X
    float sumX = 0;
    foreach (Vector2 v2 in tpolygon.points)
        sumX += v2.x;
    float centreX = sumX / tpolygon.points.Length;

    // Flip each path in the polygon
    for (int k = 0; k < tpolygon.pathCount; k++)
    {
        List<Vector2> mirrored = new List<Vector2>();
        List<Vector2> pathPoints = new List<Vector2>(tpolygon.GetPath(k));
        for (int i = 0; i < pathPoints.Count; i++)
        {
            Vector2 v2 = pathPoints[i];
            float xx = v2.x - 2 * (v2.x - centreX);
            mirrored.Add(new Vector2(xx, v2.y));
        }
        tpolygon.SetPath(k, mirrored);
    }
    Debug.Log("flipped paths: " + tpolygon.pathCount);

}