レーザーの角度計算について

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

レーザーの角度計算について

#1

投稿記事 by atrix » 10年前

レーザーの角度計算は画像のような考え方でできるのは分かるのですが
コードを見てみると以下のようになっています。

コード:

 
void conv_pos0(double *x, double *y, double x0, double y0, double mx, double my,double ang){
	double ox=x0-mx,oy=y0-my;
	*x=ox*cos(ang) -oy*sin(ang);
	*y=ox*sin(ang)+oy*cos(ang);
	*x+=mx;
	*y+=my;
}

ここで疑問に思ったのですが、なぜ*xの計算の時、-oysin(ang)となっているのでしょうか?
また同様に、なぜ*yの方もsinが正なのでしょうか?
行列式では逆のはずなのですが、よく理解できません。
どうかよろしくお願いしますm(__)m
添付ファイル
13.png
13.png (7.11 KiB) 閲覧数: 2402 回

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: レーザーの角度計算について

#2

投稿記事 by みけCAT » 10年前

cos(-ang)==cos(ang)、sin(-ang)==-sin(ang)です。
従って、回転行列のsinの符号を逆にすると、angの解釈が逆になります。
さらにy軸を反転させると、元の回り方になります。

…と言いたいところですが、画像の「行列式」とコードはang=βとして一致しているように見えます。
「行列式では逆のはず」とはどういうことでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: レーザーの角度計算について

#3

投稿記事 by Tatu » 10年前

34章の説明(および対応するプロジェクト)のコードでは

コード:

//座標回転
//(x0,y0)から(mx,my)を基準にang角回転した角度を(x,y)にいれる
void conv_pos0(double *x, double *y, double x0, double y0, double mx, double my,double ang){
        double ox=x0-mx,oy=y0-my;
        *x=ox*cos(ang) +oy*sin(ang);
        *y=-ox*sin(ang)+oy*cos(ang);
        *x+=mx;
        *y+=my;
}
となっていて直前までの説明と符号が合っていません。
最後に編集したユーザー Tatu on 2014年5月01日(木) 19:30 [ 編集 1 回目 ]

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

Re: レーザーの角度計算について

#4

投稿記事 by atrix » 10年前

お答えいただき、ありがとうございました。

私がプログラムの符号をいじってそのままにしてしまっていたので、こちらの説明が合わず申し訳ございませんでした。

cos(-θ)=cosθ,sin(-θ)=-sinθ,なのですね。
こう解釈すればy軸を反転を考えなくても、元の行列式を変形するだけで計算が合いますね。

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

閉鎖

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