4

2つのPolyLineが交差するかどうかを確認するのに問題があります。

主な目的は、最後のXとYを他のPolyLineと比較し、それが衝突しているかどうか、つまり交差しているかどうかを確認することです。

XとYを移動するためにデータにギャップがあるため、ほとんどの場合、他のポリラインでXとYを見つけることができません。

データ自体ではなく、ビジュアルツリーなどを比較する必要があると思いますが、その方法がわかりません。

<Canvas x:Name="LayoutRoot" Background="Black" Margin="2">
    <Polyline x:Name="player3line" Stroke="GreenYellow" StrokeThickness="4" Points="146,106 141,106 136,105 131,105 126,105 121,106 116,108 112,110 108,113 104,115 100,118 96,120 92,123 88,126 84,129 80,132 77,136 74,140 72,144 69,148 67,152 64,156 " />
    <Polyline x:Name="player4line" Stroke="Cyan" StrokeThickness="4" Points="85,113 89,116 93,119 97,121 102,123 107,124" />
</Canvas>

これら2つが交差するかどうかを確認する簡単な方法が必要ですか?

4

2 に答える 2

2

私が知っているSilverlightには魔法のハードウェア/ソフトウェアの衝突テストがないため、衝突テストはデータに対して実行する必要があります。

2つのポリラインの場合、ラインの各セグメントを他のラインの各セグメント(またはスターターの場合は一方または両方の簡略化されたバージョン)と照合する必要があります。

最初に境界と長方形の衝突をチェックでき(各ポリゴンの最小および最大のx、y位置が境界長方形を作成します)、それらが完全に重なっている場合は、個々の線分に衝突がないかチェックする必要があります。

この種の衝突テストについて私が知っている近道はありません。チェックをスピードアップするためのほんの少しのトリック。

このリンクは高レベルの例を示していますが、ゲーム指向のソリューションもあります。

于 2011-08-11T21:33:02.937 に答える
1

ストロークの太さが4なので、ポイントの周りのすべての座標を検索する必要があると考えました。

だから私はX-2からX+2まで、そしてY-2からY+2までチェックする必要があると思いました。

だから私はこれをしました、そして驚くべきことにそれは今のところうまくいきます、私はそれが完璧ではないことを認めます、しかしそれは単純です、そして今のところ私はこの方法でCPUスパイクを見ません:

  private bool CheckCollision(Point centerPoint)
    {
        bool functionReturnValue = false;

        //wall collision
        if (centerPoint.X - 1 < 0
            || centerPoint.X + 1 > (int)LayoutRoot.ActualWidth
            || centerPoint.Y - 1 < 0
            || centerPoint.Y + 1 > (int)LayoutRoot.ActualHeight)
        {
            functionReturnValue = true;
        }

        //player collision
        if (!functionReturnValue)
        {
            foreach (var player in playerList) //all players are in this list
            {
                for (int i = Convert.ToInt32(centerPoint.X - 2); i < centerPoint.X + 2; i++)
                {
                    for (int j = Convert.ToInt32(centerPoint.Y - 2); j < centerPoint.Y + 2; j++)
                    {
                        var point = new Point() { X = i, Y = j };
                        if (player.CoordinatePoints.Contains(point))
                        {
                            functionReturnValue = true;
                            goto END;
                        }
                    }
                }
            }
        }
        goto END;

     END:
        return functionReturnValue;
    }
于 2011-08-13T15:18:00.847 に答える