0

平面上の点の 4 つの座標を取得します。それらをすべて線で接続する必要があります。線が交差してはなりません。

あなたの戦略は何ですか?

画像を見る例

私の最初の直感は、ポイントを「左上」「右上」「左下」「右下」に整理し、左上が左下、左下が下になるように接続し続けることでした。右、右下は右上、右上は左上に接続します。

これはほとんどの場合に機能しますが、すべてではありません。より良い戦略はありますか?

皆さん、ありがとうございました。

4

2 に答える 2

0

まあ、100% 確信できるほど十分にゲームを作ったわけではありませんが、次のようにすればうまくいくと思います。

  • ポイントを選択します。
  • 他の 3 つのポイントへの 3 つのベクトルを取得するには、他のポイントからそれを減算します。
  • 内積と大きさを使用して、ベクトルの各ペア (3 つの点に対して 3 つのペア) の間の角度を決定します。
  • ポイントを他の 2 つのポイントに接続し、それらのベクトル間の角度が最大になります。
  • 残りの点もその 2 点に接続します。

これまでのところ、それが失敗する例は思いつきませんでしたが、それは単に夜が遅すぎるからかもしれません。:)

クイックノート:

ドットB = ax *bx + ay*by [ + az*bz ... ] = | || _ B |cos(A と B の間の角度)


計算をより効率的にするには:

まず、内積では 0 から 180 度の角度しか得られないため、どのコサインが小さいか、またはより負かを確認することで、どの角度が大きいかを確認できます。これにより、逆余弦を実行する必要がなくなります。

内積は |A||B|cos(角度) を与えるので、大きさごとに sqrt 関数を実行する必要があり、|A||B| で除算する必要があります。コサインを取得します。ただし、少しのヒューリスティックで、sqrt も回避できます。|あ| と |B| 常に正でなければなりません。そう:

  • 一方の内積が負で、もう一方が正の場合、負の内積は負の余弦を持ち、もう一方の内積は正の余弦を持つ必要があるため、負の内積の方が角度が大きくなります。

  • 両方とも正の場合は、内積を 2 乗し、2 乗した値 (x^2 + y^2 [+ z^2...] (平方根なし)) で割ることができます。結果が小さいほどコサインが小さくなり、角度が大きくなります。

  • 内積が両方とも負の場合、同じ操作を実行しますが、結果が大きいほどコサインが小さくなり、角度が大きくなります。

于 2015-02-01T05:11:41.290 に答える