そのため、XNA / C#でリスクタイプのゲームに取り組んでいます。私はこれに似た地図を持っており、各地域(番号)でマウスオーバーを検出できる必要があります。これらの領域が正方形の場合、それぞれを長方形で表すことができるため、簡単です。ただし、それらは異なるサイズのポリゴンです。正方形のように振る舞う多角形はありますか?ない場合は、どうすればよいですか?
3 に答える
私はこれを推測します:各番号に色を付けて、これらの色であなたの写真を再現してください:すべての形はその特定の色になります。画面上に描画しないでください。参照マップとしてのみ使用してください。また、ユーザーが元のマップ上でマウスをクリックまたは移動すると、マウスの座標をカラーマップに投影し、マウスの下にあるピクセルの色を確認します。各色は領域の数に関連付けられているためです...
これは C# 固有のものではありません (私はこの言語で何も書いたことがないので、どのような API があるかわかりません)。ただし、ポイントがポリゴンの内側にあるかどうかを検出するために思い浮かぶ 2 つのアルゴリズムがあります (これは使用できます)。マウス ポイントが別のポリゴン/マップ シェイプ上にあるかどうかを検出します)。
1 つはレイキャスティングに基づいており、(マウス) ポイントから「無限」(この場合はボードの端) まで 1 方向にレイをキャストし、ポリゴンの端を横切る回数を数えます。奇数の場合、点は多角形の内側にあり、偶数の場合、点は多角形の外側にあります。
それへの wiki リンク: http://en.wikipedia.org/wiki/Point_in_polygon#Ray_casting_algorithm
頭に浮かぶ他のアルゴリズムは三角形に対してのみ機能すると思いますが、実装するのはもっと簡単だと思います(形状をざっと見てみると、それらは簡単に三角形に分解でき、一部はすでに三角形になっていると思います)。ポイントが三角形のすべてのエッジの同じ(内部)「側」にあるかどうかを確認することです。ポイントがエッジに対してどの「サイド」にあるかを調べるには、2 つのベクトルを作成します。最初のベクトルはエッジ自体 (2 つのポイントで構成される) になり、もう 1 つのベクトルはそのエッジの最初のポイントになります。入力ポイントに、それらの 2 つのベクトルの外積を計算します。結果は負または正になり、「方向」を決定するために使用できます。
それへのリンク: http://www.blackpawn.com/texts/pointinpoly/default.html (そのページには、三角形でも機能する別のアルゴリズムがあります)
ポリゴンでのヒット テストは、リアルタイムで行うのはそれほど難しくありません。マップが巨大な場合は、最適化に KD-Tree を使用できます。Contains
それ以外の場合は、ポリゴンの簡単な方法を見つけて使用します。私は別のコンピューターに1つ持っています。よろしければお知らせください。