ikarosの作業場

飛行機の設計もできる系のCshaper。「なおこの記事は個人的見解であり、所属する組織の意見とは一切関係がありません」と書かざるを得なくなった悲しみを知れ

物理シミュレーターづくり:衝突を感知する-二つの図形が重なり合ったかどうか判別する

今日は少しプログラミングから離れて少し数学的なお話がメイン。
ですが、ちょっとプログラミングに役に立つかなーということを書いていきます

物理の世界においては衝突という事象があり衝突が起きるとその物体が相互作用を及ぼし物体の速度を変えるという

こんなことを実装する一歩手前、衝突したかどうか判別するということをやっていきます。

1・動機
物理だから衝突はどうしても実装しなくちゃいけない
でもWPFのRectangleやらEllipseには自分自身が描かれている領域にほかのコントロールが含まれているかどうか判別する関数がない
(限定的にはあるもののすべてのコントロールに対して使えるわけではない)

2.実装
そもそも衝突するときの図形が満たすべき条件は何?(哲学)

 衝突をしている
 ⇔該当する二つの図形が数式によって表される領域だと考えるとその二つの図形の領域に共通範囲が存在している
 ⇔どこかしらで二つの図形を構成する数式において交点を持つ場所がある

ということではないでしょうか

というわけで予備校からもらってテキストを元に作った数式がこちら
f:id:ikarostech:20150425202107j:plain
f:id:ikarostech:20150425202112j:plain

多少の例外はありますが全ての頂点においてこの式を時計回りとかで当てはめていけば求められそうです
直線だけじゃなくペジェ曲線も行けるのがいいとこ

例外としては・・・
・片方の図形が円の場合(頂点が存在しないから)
例として円同士でやってみましょう
f:id:ikarostech:20150425202115j:plain
円の場合は円の中心との距離と曲線までの距離を求めてどっちが大きいか調べればよさそうですね

以上


P.S.
私の書く文章はどこかわかりにくいですよね?という自覚は持っています・・・
何かわかんないぞーってことがあればTwitter @ikarostech までリプか何か送っていただければ何か回答するかもしれないので
お気軽に質問どうぞ
やっぱり書いたことには責任持たないとね

当サイトのソースコード及びその他の情報は個人・商用問わず自由に使っていただいてかかまいませんが、当サイトの情報が元で発生したいかなる結果・不利益については責任を負いかねますのでご了承ください