|
|
2007/6/11(Mon) 20:34:36|NO.8898
点A(x1,y1)、点B(x2,y2)、点(x3,y3)があって、
直線ABに対して直線ACの角度を求める方法はあるでしょうか?
数値はラジアンではなく360度の方で求めたいです。
どうかよろしくお願いします。
|
|
2007/6/11(Mon) 22:14:07|NO.8899
ラジアンででてくれば度に直せます。相互変換は簡単です。
rad = 3.14 / 180.0 * deg ;度からラジアンを求める
deg = 180.0 / 3.14 * rad ;ラジアンから度を求める
今ひとつわかりにくいかもしれないけどとりあえず資料:
http://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%B8%E3%82%A2%E3%83%B3
さて、角度ですが…あsdfさんがどの程度数学の知識があるかわかりません。
ベクトルは分かりますでしょうか?分からなかったら言ってください。わかりやすい説明考えてみます。(無理かもわかりませんが…。)
それと、アークタンジェントは分かりますでしょうか?資料なら「アークタンジェント」でググればすぐ出てきます。
とりあえず「ベクトル」が分かると言う前提での説明を置いておきます。
ベクトルを知らないのなら読まないほうがいいかも。(^ ^;
まず、ベクトルCAとCBの2つを考えます。Cを原点と考えるわけです。
次にそれぞれのベクトルとX軸とがなす角度(Y軸でもいいです)を求めます。アークタンジェント(atan)使えばでてきます。
これで角度が2つ出ますね。でてきたら片方の角度から片方の角度を引けばokです。
紙に書きながら考えると分かりやすいです。
|
|
2007/6/14(Thu) 02:55:58|NO.8912
返信ありがとうございます。
ラジアンは何とか理解できました。
しかしベクトルは何度もノートに書き、自分なりに理解しようと努力しましたが
どうもいまいち把握できませんでした。
|
|
2007/6/14(Thu) 08:37:33|NO.8913
HSPのエディタ上で「atan」と書いて、その上にカーソル合わせてf1キーを押したら、
取り合えず1辺の角度の出し方は分かるんでね?
したら、あとはその差じゃろ。
|
|
2007/6/15(Fri) 08:36:17|NO.8941
>でも知ってると便利なのでとりあえずベクトルの資料だけでもどうぞ。
これ分かりやすいな(笑
|
|
2007/6/15(Fri) 12:27:42|NO.8943
>図を書いて説明できれば、凄く説明しやすいんですが…。
こんな感じでどうでしょう?
・B(x2,y2)
・C(x3,y3)
・A(x1,y1) ・D(x2,y1) ・E(x3,y1)
点DEを追加します。
∠BAD=atan((y1-y2)/(x2-x1)) ∠CAE=atan((y1-y3)/(x3-x1))
∠BAC=∠BAD-∠CAE
答えはラジアンだから180/πを掛ける。
やはり図に描くのはむずかしい!
|
|
2007/6/19(Tue) 18:53:40|NO.9026
ようやくわかってきました。
取り合えず自分でスクリプトを作って見ました。
左上の数字が角度です。
しかしこれを回転させてみるとどうも一瞬数値が変になってしまいます。
これを解決する方法はありますでしょうか?
#module
#deffunc kyori double A,double B,double C,double D,var R
R=sqrt((A-C)*(A-C)+(B-D)*(B-D))
return
#global
#define ONERD 3.141592/180
x1=320.0 : y1=240.0
x2=200.0 : y2=100.0
x3=400.0 : y3=100.0
repeat : redraw 0 : color ,, : boxf
rd=atan(x2-x1,y2-y1)+ONERD
kyori x1,y1,x2,y2,R
x2=x1+sin(rd)*R : y2=y1+cos(rd)*R
rd=atan(x3-x1,y3-y1)+ONERD
kyori x1,y1,x3,y3,R
x3=x1+sin(rd)*R : y3=y1+cos(rd)*R
color 255,255,255
circle x1-2,y1-2,x1+2,y1+2
circle x2-2,y2-2,x2+2,y2+2
circle x3-2,y3-2,x3+2,y3+2
line x1,y1,x2,y2
line x1,y1,x3,y3
pos 0,0
mes atan( x2-x1 , y2-y1 )
mes atan( x3-x1 , y3-y1 )
mes "角度"+atan( x2-x1 , y2-y1 ) - atan( x3-x1 , y3-y1 )
wait 1 : redraw 1 : loop
|
|
2007/6/19(Tue) 19:11:56|NO.9027
すみません、こっちをお願いします。
#module
#deffunc kyori double A,double B,double C,double D,var R
R=sqrt((A-C)*(A-C)+(B-D)*(B-D))
return
#global
#define ONERD 3.141592/180
x1=320.0 : y1=240.0
x2=200.0 : y2=100.0
x3=400.0 : y3=100.0
repeat : redraw 0 : color ,, : boxf
rd=atan(x2-x1,y2-y1)+ONERD
kyori x1,y1,x2,y2,R
x2=x1+sin(rd)*R : y2=y1+cos(rd)*R
rd=atan(x3-x1,y3-y1)+ONERD
kyori x1,y1,x3,y3,R
x3=x1+sin(rd)*R : y3=y1+cos(rd)*R
color 255,255,255
circle x1-2,y1-2,x1+2,y1+2
circle x2-2,y2-2,x2+2,y2+2
circle x3-2,y3-2,x3+2,y3+2
line x1,y1,x2,y2
line x1,y1,x3,y3
pos 0,0
mes atan( x2-x1 , y2-y1 )
mes atan( x3-x1 , y3-y1 )
mes "角度"+( atan( x2-x1 , y2-y1 ) - atan( x3-x1 , y3-y1 ) )
wait 1 : redraw 1 : loop
|
|
2007/6/19(Tue) 20:40:46|NO.9031
こうして、
mes atan( x2-x1 , y2-y1 ) / ( 3.141592 / 180.0)
mes atan( x3-x1 , y3-y1 ) / ( 3.141592 / 180.0)
mes "角度"+(( atan( x2-x1 , y2-y1 ) - atan( x3-x1 , y3-y1 ) ) / ( 3.141592 / 180.0))
度で表示したら理由が分かるんじゃね?
|
|
2007/6/20(Wed) 17:01:03|NO.9036
すみません、原因はわかるのですが解決方法がわからなくて・・・
|
|
2007/6/20(Wed) 19:43:17|NO.9040
本当に理由が分かっていれば対処できそうな気もするけど・・・
ラジアンじゃ分かりにくいのかも知れない。
ので、度で説明すると
例えば、普通に答えが出る場合と言うのは、
直線1の角度が10度、直線2の角度が20度等の状態。
20度-10度で、差は10度と分かる。
ところが、直線1の角度が355度で、直線2の角度が5度だったらどうなるか?
5度-355度では計算が狂ってしまう。
じゃーどうするか?
通常の時は直線1の角度が直線2の角度より小さいのが前提なんだから、
それにあわせればいいじゃん。
直線2の角度5度に、360度足してやっても、角度としては同じ意味だべ。
365度-355度なら、計算結果は問題ないでそ。
つまり、直線1の角度が直線2より大きくなったら、直線2の角度に360度足して、
それから計算すればいいと言うわけ。
|
|
2007/6/20(Wed) 22:41:10|NO.9043
あ、なるほど。
言われるまで全然思いつきませんでした。
どうもありがとうございます。
これで全て解決しました。
|
|