Перевернуть массив вершин - PullRequest
2 голосов
/ 17 марта 2011

У меня есть массив вершин позиции, которые составляют 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),
        };

Какой алгоритм я могу использовать для изменения позиций, чтобы результирующий многоугольник был перевернут?Мне нужно перевернуть многоугольник как по горизонтали, так и по вертикали.

Ответы [ 4 ]

4 голосов
/ 17 марта 2011

Предполагая, что класс Vector2 имеет два свойства / имена членов x и y:

    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 голос
/ 17 марта 2011

Если вы переворачиваете точку (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

Скажем, значения х. * и O - t, m и b соответственно (верх, середина и низ). Как видите, расстояние a = t-m и b = m-a. Следовательно, b = m- (t-m) = m-t + m = m * 2-t

Затем вы можете использовать этот принцип, чтобы написать алгоритм для переворачивания всех точек вокруг другой точки, и это даст вам ваш перевернутый многоугольник!

0 голосов
/ 17 марта 2011

Сначала вы должны взять центр окружности, которая вписывает многоугольник, затем взять линию, которая идет вертикально и горизонтально по центру, для каждой точки сначала возьмите симметрию с другой стороны вертикальной линии, затемПовторите действие для симметричной точки на другой стороне горизонта, у вас все точки перевернуты.

До встречи!

0 голосов
/ 17 марта 2011

Не уверен, что есть «правильный» способ, но что-то вроде ниже должно работать, чтобы перевернуть многоугольник, как по горизонтали, так и по вертикали.

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