3

ユーザーが描いた一連のポイントがあります。彼らはいくつかのオブジェクトの周りを描きます。

衝突を検出する領域を見つけることができるように、この一連の点を何らかの方法で形状に変換する必要があります。

画像が明確になります:

形状 http://www.imagechicken.com/uploads/1277188630025178800.jpg として表される点のセット

私がこれまでに持っていた最良のアイデアは、すべてのピクセルを繰り返し処理して、形状の「内側」または「外側」にあるかどうかを判断することですが、それは恐ろしく遅く、「内側」を判断する方法さえわかりません/ 「外側」ビット...

ヒントはありますか?私は .NET (C# と XNA) を使用しています。

4

3 に答える 3

1

別のフォーラムの助けのおかげで、うまくいきました。

私はGraphicsPathクラスを使ってすべての大変な仕事をしてくれました。

これは私の方法が最終的に次のようになったものです:

public bool IsColliding(Vector2 point)
{
    GraphicsPath gp = new GraphicsPath();

    Vector2 prevPoint = points[0];
    for (int i = 1; i < points.Count; i++)
    {
        Vector2 currentPoint = points[i];

        gp.AddLine(prevPoint.X, prevPoint.Y, currentPoint.X, currentPoint.Y);

        prevPoint = currentPoint;
    }
    gp.CloseFigure();   //closing line segment

    return gp.IsVisible(point.X, point.Y);
}

お二人ともご提案ありがとうございます

于 2010-06-23T11:42:27.173 に答える
1

形状は、それぞれが単純な閉じた多角形である複数の形状の結合と考えることができます。
すべてのオブジェクトがポリゴンの内部にあるかどうかを次の方法でチェックします。
すべての点が線で接続されている - 各線には、それを定義する方程式があります。
すべてのオブジェクトについて - このオブジェクトを通過する直線の方程式を作成します。
ここで、各オブジェクト方程式について、このオブジェクト方程式と交差する線 (点の間の線) の数を確認する必要があります。 2 つのドット) と、オブジェクトの片側にある交点のみ (片側を選択 - 重要ではありません)。
カウントが偶数の場合 - オブジェクトはシェイプの外側にあります - それ以外の場合は内側にあります。

于 2010-06-22T06:10:56.620 に答える
1

私が言うことの前兆にすぎませんが、私はこの分野での経験がありません.これは私が問題に取り組む方法です.

多くのゲームがこれに使用する戦術は、ヒット ボックスとして知られています。点が正方形の内部にあるかどうかを検出するのは、他のどの図形よりもはるかに簡単です。しかし、これは正確な衝突を与えるわけではなく、目的のオブジェクトのすぐ外側にある可能性があります。

コリジョン 'バブル' が以前に使用されているのを見たことがあります。ここに私が見つけたリンクがあります。これは、コンソール ゲームの大乱闘スマッシュ ブラザーズでのコリジョン バブルの使用について説明しています。

点、距離の式、および半径が与えられれば、コリジョン バブルを簡単に実装できます。

それをさらに一歩進めるために、私は少し調査を行いました。気の利いた小さなアルゴリズム (上の 2 つの提案よりも高度な)、「凸オブジェクトのギルバート・ジョンソン・キールシ衝突検出アルゴリズム」を見ました。これがあなたへのリンクです。提供される実装は D で記述されています。C# で作業している場合、翻訳するのはそれほど難しくありません (アルゴリズムも消化することを強くお勧めします)。

これがあなたに何らかの方向性を与えることを願っています。

于 2010-06-22T06:40:38.710 に答える