「レーザーを作ってみよう」(龍神録34章)内のコードについて
Posted: 2012年9月03日(月) 23:17
こんにちは,初めまして。ゲームプログラミングに興味を持ち,参考にさせて頂いています。
早速ですが,件名内の以下のコードの,コメント付き(できれば毎行…)の解説が欲しく思いました。
/* ここから引用 */
//点と線分との距離を求める
double get_distance(double x, double y, double x1, double y1,
double x2, double y2){
double dx,dy,a,b,t,tx,ty;
double distance;
dx = (x2 - x1); dy = (y2 - y1);
a = dx*dx + dy*dy;
b = dx * (x1 - x) + dy * (y1 - y);
t = -b / a;
if (t < 0) t = 0;
if (t > 1) t = 1;
tx = x1 + dx * t;
ty = y1 + dy * t;
distance = sqrt((x - tx)*(x - tx) + (y - ty)*(y - ty));
return distance;
}
/* ここまで引用 */
「垂線のベクトルと線分αβとの内積が0になる」ことは調べてみてなんとかわかったのですが…
aは線分の長さの2乗?とするとbやtは…等と考えているうちに頭がぐるぐるとなってしまいました。
お恥ずかしい限りです…学生時代の数学や物理って結構難しかったのだなぁとしみじみ思います。
よろしくお願い致します。
早速ですが,件名内の以下のコードの,コメント付き(できれば毎行…)の解説が欲しく思いました。
/* ここから引用 */
//点と線分との距離を求める
double get_distance(double x, double y, double x1, double y1,
double x2, double y2){
double dx,dy,a,b,t,tx,ty;
double distance;
dx = (x2 - x1); dy = (y2 - y1);
a = dx*dx + dy*dy;
b = dx * (x1 - x) + dy * (y1 - y);
t = -b / a;
if (t < 0) t = 0;
if (t > 1) t = 1;
tx = x1 + dx * t;
ty = y1 + dy * t;
distance = sqrt((x - tx)*(x - tx) + (y - ty)*(y - ty));
return distance;
}
/* ここまで引用 */
「垂線のベクトルと線分αβとの内積が0になる」ことは調べてみてなんとかわかったのですが…
aは線分の長さの2乗?とするとbやtは…等と考えているうちに頭がぐるぐるとなってしまいました。
お恥ずかしい限りです…学生時代の数学や物理って結構難しかったのだなぁとしみじみ思います。
よろしくお願い致します。