profile
2006.02.18

うーむ。
意外とスマートな解決方法が思いつかないのだが、なにかいい方法あるのだろうか。

同じ正円周上にある2点(p1とp2)でp1からp2に正円上を最短距離で進みたいときに、角度を+していけばいいのかーしていけばいいのかというのをできるだけ簡潔に求めたい。

考えているのだけど、いまいち思い浮かばない。さらっと数学的に実は解法がありそうな気がするけど、知らないだけなのか。。普通にやると、if文だらけになってしまう。

具体的に、Flash上のシチュエーションを考える。
p1からp2に移動したいとする。

1. 計算上、2点(p1,p2)の角度(r)がマイナスになっている可能性があるので、それを+の値に変換する。
if(this.p1.r < 0) this.p1.r += 360;
if(this.p2.r < 0) this.p2.r += 360;

2. 二点の角度の大きいほうを調べて、小さいほうをひく。そのひいた数字が180より小さければ、そのほうの角度が小さい。で、大きいほうがp1かp2かによってどちらの方向に進めばいいかが決まる。

var direction = 0;
if(this.p2.r > this.p1.r){
// 目的地の角度のほうが大きい数字の角度
if(this.p2.r- this.p1.r < 180){
//目的地に順向きにすすむほうが近い
direction = 1;
}else{
direction = -1;
}
}else if(this.p2.r < this.p1.r){{
//今いる場所のほうが大きい数字の角度
if(this.p1.r - this.p2.r < 180){
// p2からp1に順向きに進むほうが近いので、つまり逆方向
direction = -1;
}else{
direction = 1;
}
}


という感じになるんだけど(ちゃんと検証してないけどたぶんあってる)
なんとかならないかなー。

昔ベクトルから角度を求めるのに0〜360の数字で求めたくてこれも同じようにif文だらけだったんだけど、いろいろ考えた末に、
((Math.atan(vy/vx)/Math.PI+(vx<0))*180+720)%360;
こういう式が導けた。これはとってもいい感じ。こういうふうにしたいんだけどなぁ。

カテゴリaction script
trackback urlhttp://blog.tokyoace4.com/cgi-bin/mt/mt-tb.cgi/621
COMMENT

円の中心が原点にあるとして、p1がx軸となす角をθ1、p2がx軸となす角をθ2。sin(θ1-θ2)の正負を見たらいいだけでは?

投稿者:ぱない | 2006年02月19日 22:17

うおい!
すばらしいな。さすが博士号!!

c1からc2にいきたいとき。
それぞれのrは正円の中心を原点として、X軸の+の方向が0度のときの角度。

var s = Math.sin((this.c2.r-this.c1.r)*Math.PI/180);
var degree = s/Math.abs(s);

でいけるようだ。テストした。
うひょー

投稿者:tohsaki | 2006年02月20日 07:09











(コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。)

TRACKBACK

» 正円周上の2点の小さい方の角度 送信元 fladdict.net blog
blog.tokyoace4.com: 正円周上の2点の小さい方の角度 昔、散々... [詳しくはこちら]

トラックバック時刻: 2006年02月19日 02:56