私は小惑星のクローンに取り組んでいます。すべてが 2D で、C++ で書かれています。
小惑星については、ランダムな N 辺のポリゴンを生成しています。私はそれらが凸であることを保証しました。次に、それらを回転させ、回転速度を与えて、宇宙を飛ばします。それはすべて機能し、とてもきれいです。
衝突には、自分で考えたアルゴリズムを使用しています。これはおそらく悪い考えであり、プッシュするようになった場合は、おそらくすべてを破棄して、インターネットでチュートリアルを見つけるでしょう.
私はすべてを書いて実装しましたが、衝突検出は問題なく動作します....ほとんどの場合。画面に明らかに衝突がある場合はランダムに失敗し、何も触れていないときに衝突を示すことがあります。実装をどこかでフラブしたか、アルゴリズムがひどいです。私の実装 (複数のソース ファイルにまたがる) のサイズ/スコープのために、私はそれについてあなたを悩ませたくありませんでした。私のアルゴリズムが実際に健全であることを誰かに確認してもらいたかっただけです。その時点で、私は大きなバグハントに行くことができます.
アルゴリズム:
小惑星ごとに、小惑星を描画するときに各頂点がどこにあるべきかを出力する関数があります。隣接する頂点の各ペアについて、頂点が置かれている線の式を生成します。 y=mx+b
フォーマット。次に、船の頂点の 1 つから始めて、その点が小惑星の内部にあるかどうかをテストします。ポイントの X 座標を入力し、出力を実際の Y 値と比較することから始めます。これにより、ポイントが線の上にあるか下にあるかがわかります。次に、小惑星の中心についても同じことを行い、線のどの半分が小惑星の「内側」と見なされるかを判断します。次に、頂点のペアごとに繰り返します。ポイントが小惑星の中心と同じ側にない線を見つけた場合、衝突がないことがわかり、そのポイントの検出を終了します。私の船には 3 つのポイントがあるので、次のポイントをテストする必要があります。3 つのポイントすべてが早期に終了した場合、船のどのポイントにも衝突はなく、完了です。
このアルゴリズムで発見した 2 つの問題は次のとおりです。
- 凹面ポリゴンでは機能しません。
- Slope が定義されていない Edge の場合に問題があります。
NAN
すべてのポリゴンが凸面であることを確認し、未定義の勾配の問題を処理するコードを書きました ( で割るとdouble が返される必要0
があるため、そのテストは非常に簡単です)。
それで、これはうまくいくでしょうか?