計算が面倒だから円の衝突判定プログラムを作ってみた

スポンサーリンク

 

こんにしょわ。

大学生の皆さま。残念ながら楽しかった夏休みも儚く終わり、大学の授業が再開しました。

身体はもう慣れましたか?朝起きれますか?的な。

夏休み最高だったなぁー。白目

な具合でなかなか夏休みモードから切り替えられなかった1週間でしたが、僕はようやく勉強モードに入りました。

 

で、今日はというと、

このあいだ家庭教師で高校生の女の子に数学の図形問題を教えてきたときのお話をしようと思います。

早速こういう話をするのはあまり好ましくないのですが、僕が教えているおんにゃのこは本当に綺麗な子です。うむ。

大学でも滅多に見かけないレベルの美少女系で僕はこんな子に教えられて超ラッキーだなっていつも思っています。

 

勉強なんてしてないでモデルさんを目指したらいいんじゃない?って僕はいつも言っているんですが、本人は勉強が好きで大学に進学したいみたいです。

す、すごい……………..尊敬します。

勉強もできてこんなにかわいいとか。

 

確かに勉強が好きなだけあって、いつも質問してくる問題は結構手間がかかって考えさせられる「良問」が多く、僕も勉強になります。

その日も例外なく、図形問題と極限問題とが混ざり合った複雑な複合問題を一緒に解きました。

 

詳しい説明は省略しますが、「手間がかかるっ!」

様々な場合分けを必要として、その場合わけを考えるうえでたくさん計算をしなければならずメインの難しい極限計算に辿りつくまでに時間がやけにかかる。

しかもその手の問題はどこか計算ミスがあるとその先の考え方やプロセスも変わってしまうため、逐一正確に計算しなければなりません。

 

ということで、少しでも計算を省いたうえで厳密に計算をしたかったので、僕はチートを使わせていただきました。

問題を解くうえで必要な計算は全部プログラムで計算して確かめました。

せっかくですので、今日はそのときに使ったプログラムの1つをここで紹介しようと思います。

 

クラスの使い方がいまいちわからないという方はぜひ参考にしてください。

僕は意識しないと使わないので積極的に使うようにしています。

 

円の衝突判定プログラム

2円の位置関係

「衝突判定」と銘打っていますが、実はそんな物理的なカッコいい感じのものではなく、ただの基本図形のお話です。

数学の専門用語を用いて説明せざるを得ないので、数学Ⅱの「2円の位置関係」を少し思い出してください。

2円の位置関係は全部合わせて5パターンあり、2円の半径をそれぞれ \(r_1\) , \(r_2\) とし、また中心間距離を \(d\) とすると

  1.  分離       \(d > r_1 + r_2 \)
  2.  外接       \(d = r_1 + r_2 \)
  3.  2点で交わる   \(| r_1 – r_2 | < d < r_1 + r_2 \)
  4.  内接       \(d = | r_1 – r_2 | \)
  5.  包含       \(d < | r_1 – r_2 | \)

がそれぞれの位置関係について成り立ちます。

僕の拙い手書き図形で示すとこんな感じになります。

※ @yukiWavy > @yuki_wet

僕の字はクセが強いというかただ単に下手くそというかで非常に読みずらいかと思いますがご勘弁ください。

でもあれですよ?あのあれ、

本当はグラフィック系ソフトウェアで書こうと思えば書けるんですけど、

面倒くさいとかそういうアレじゃなくて手書きの方が「気持ち」も伝えられるかなと思いまして、ほんとに。

 

ということで、この計算方法に従いプログラムを書きます。

プログラムの仕様は、ユーザ が2つの円の中心座標と半径とを入力することで、その2つの円の位置関係がどうなっているかを計算し、状態を返すというものです。

  1.  分離      Separated
  2.  外接      Circumscribed
  3.  2点で交わる  Collision (Intersected) 
  4.  内接      Inscribed
  5.  包含      Intension

英語表記で表示しますが、これは格好つけようとかそういうあれではなくプログラミング環境の文字コードが UTF-8 で日本語が文字化けして意味不明になることを防ぐためです。

英語が適当かはわかりません。

また、プログラムの記述上、同一円は「内接」扱いになります。

加えて扱っている数学の問題の都合上「2点で交わる」の位置関係を「Collision = 衝突」と定義しています。

ご了承ください。


2円の衝突判定プログラム

 

実行例 1実行例 2実行例 3実行例 4実行例 5

 

おわりに

 

あれ?このプログラム作る方が手間かかったんじゃ?

普通に紙で計算した方が楽だったんじゃ。。。

なんて思う方が何人もいらっしゃると思います。

 

確かに!

僕もそう思いました。

ですがまあ僕はカチャカチャプログラムを作る雄姿を教え子のおにゃのこに見せることができたので満足です。

もちろん休憩時間に作りました。

 

ということで「かわいい子ほど裏では勉強してる」の回はここまでにしようと思います。

 

ではまた次回!

スポンサーリンク


ABOUT ME!

yuk!

国立大学情報学科に通う大学生です。天然パーマと戦いながらすーぱーエンジニアを目指し技術とセンスを磨いています。 室内に引きこもりがちでヘビメタと猫と甘いものが救いのキーボードカチャカチャ生活ですが、最近はブログで文章を書くことが楽しいです。モットーは「 Who dares wins. = 人生是一箇,活殺全在我。」好きな言葉は「マジ卍」。