いろきゅうの(元)はてなダイアリー

はてなダイアリーから移行中…

intで判定できたー!

前日に引き続き、シューティングの当たり判定の云々です。…ペース遅いなぁ…
さて、当たり判定の数式を最適化するべく、方程式をガリゴリ解いていくことにしました。「x とか y とか、ガリゴリ使ったのも久しぶりだなぁ…」という感じで、ちょっと面白かったです。(笑
で、交点を求める連立方程式

n = 線分の傾き
f = 円の中心から線分への垂線の線分のOffset(名称忘れたよ…)
cx, cy = 円の中心
nx, ny = 線分の終点(始点 = (0,0))

y = nx
y = -x/n + f

を、あれこれ解いた結果

x = (cx * nx^2 + nx * ny * cy) / (ny^2 + nx^2)
y = (cy * ny^2 + nx * ny * cx) / (ny^2 + nx^2)

になりました。
で、コレをいざプログラミングしてみたところ、ばっちり動きました!int のまま動いてくれましたよ! これで、とりあえずは納得です!
…が、動くまでが長かった……
最初の頃は、どうしても正確に動かなかったのです。数式を再度といてみても同じ数式になるし、コード中の数式見てもおかしいところはなさそうだし…と。色々試してみてもやっぱり正確な値が出ない…なんでだーー!

…とか思って、ウン時間経った後、次のようなコードを書いていた事に気づいたんです。

int nx = pcLineEnd.X;  // よく使うので短い変数名に
int ny = pcLineEnd.Y;
int ny2 = nx * nx;      // 予めべき乗しておきましょ。
int nx2 = ny * ny;

x と y が逆じゃねーッスか……

なんちゅーか、笑うしかないと言うかなんと言うか…ああああ。 orz