レーザーのあたり判定について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
atrix
記事: 14
登録日時: 5年前

レーザーのあたり判定について

#1

投稿記事 by atrix » 5年前

龍神録プログラミングの館34章でレーザーの当たり判定についての説明があり、内容も納得できたのですが、
以下のコードの部分が理解できないのです。高校でベクトルは学習したのですがコードでみるといまいち分かりずらく、
何をしているのか、どうしてそうするのかわからないところがあります。
点と直線の距離を求めているようなのですが、dx,dyが何なのかもよくわかりません。
私はdx=ベクトルx1x2,dy=ベクトルy1y2 だと思うのですがどうなのでしょうか?
また、tがどういう役割をなしているのかが全く分かりません。
どうかなるべく簡単に教えて頂きたいですm(__)m

コード:

 
//点と線分との距離を求める
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;
}
 

アバター
Tatu
記事: 440
登録日時: 8年前
住所: 北海道

Re: レーザーのあたり判定について

#2

投稿記事 by Tatu » 5年前

図にするとこんな感じですね。
図.png
図.png (18.43 KiB) 閲覧数: 422 回
dx,dyは図のベクトルP2P3のx成分、y成分になります。

tはベクトルP2PtがベクトルP2P3の何倍かを表しています。
0<=t<=1の場合、Ptは線分P2P3上にあるのでそのまま。
t<0の場合、線分P2P3上でP1に最も近い点はP2になるのでt=0
t>1の場合、線分P2P3上でP1に最も近い点はP3になるのでt=1

atrix
記事: 14
登録日時: 5年前

Re: レーザーのあたり判定について

#3

投稿記事 by atrix » 5年前

迅速なご回答、ありがとうございました。

自分は意味が理解できてなかったので、自分で図を作ることができなかったのですが、Tatuさんの図と照らし合わせることで、なんとか自分にも理解できました。

図を参考にしながら自分なりに理解できたのですが、やはりプログラミングというのは難しいなと感じました。

なので、これからもしっかりと理解していきながら勉強していこうと思います!

ありがとうございましたm(__)m

閉鎖

“C言語何でも質問掲示板” へ戻る