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),
        };

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

4

5 回答 5

5

假设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;
    }

这将相对于两个轴翻转顶点。您没有指定新多边形相对于原始多边形的定位。如果您需要“移动”它,那么您只需将一个值添加到 allx并将另一个值添加到 all y

于 2011-03-17T07:47:34.727 回答
2

如果您在点 (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) 为 y 值。

这说明:
. 是要翻转
的点 * 是要翻转的点 O 是要结束的点

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

假设 x 的值。* 和 O 分别是 t、m 和 b(顶部、中间和底部)。如您所见,距离 a = tm 和 b = ma。因此 b = m-(tm) = m-t+m = m*2-t

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

于 2011-03-17T07:51:22.200 回答
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();
于 2011-03-17T07:40:23.557 回答
0

首先你必须取内接多边形的圆周的中心,然后取垂直和水平穿过中心的线,对于每个点,首先,在垂直线的另一侧取对称,然后重复动作对于水平另一侧的对称点,您将翻转所有点。

再见!

于 2011-03-17T07:43:30.730 回答
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);

}
于 2020-11-16T10:56:06.993 回答