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

結果のポリゴンが反転するように位置を変更するには、どのアルゴリズムを使用できますか? 水平方向と垂直方向の両方でポリゴンを反転する必要があります。

4

5 に答える 5

5

クラスVector2に2つのプロパティ/メンバー名が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;
    }

これにより、2つの軸に対して頂点が反転します。元のポリゴンに対して、新しいポリゴンにどの位置を設定するかを指定しません。それを「移動」する必要がある場合は、1つの値をすべてに追加しx、別の値をすべてに追加する必要があります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)) または ( y 値の場合は 2*yp.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

まず、ポリゴンを内接する円周の中心を取り、次に中心を横切って垂直および水平になる線を取ります。各ポイントについて、最初に、垂直線の反対側で対称を取り、次にアクションを繰り返します。水平の反対側にある対称点の場合、すべての点が反転します。

またね!

于 2011-03-17T07:43:30.730 に答える
0

「正しい」方法があるかどうかはわかりませんが、以下のようなものは、水平方向と垂直方向の両方でポリゴンを反転させるために機能するはずです。

  1. 平均 x ポイントと y ポイントを追加して中心点を見つけます。
  2. 多角形の各ポイントについて、中心点からの垂直距離と水平距離を計算し、各値を 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 に答える