- ベストアンサー
角度を求める
角度を求める xy平面上に互いに異なるA, B, C, Dの4点がありまして ABとCDのなす角θを求めるためにはどうしたらよいでしょうか。 ただし、条件として|θ|≦90°で ABを基準にCDが反時計回りに位置する場合は+, CDが反時計回りに位置する場合は-θとしたいのです というのをエクセルで求めたいのですが、良い方法をご存知でしたらご教示ください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
追記です。 AB、CDというのが実際にはABを通る直線及びCDを通る直線であるとすれば、それぞれの式を AB:y=a1x+b1 CD:y=a2x+b2 としたとき、 if(a1*a2=-1,90,degrees(atan((a2-a1)/(1+a1*a2)))) で一応求められると思います。(b1,b2は角度だけなら不要です) 直交は+90度としています。(つまり範囲としては -90<θ≦90になります) a1,a2はA=(xa,ya)~D=(xd,yd)としたときにa1=(ya-yb)/(xa-xb)、a2=(yc-yd)/(xc-xd)で求めてください。 ただ、この式だとABかCDがx=1のようにx軸に対して直交するような直線となる場合に、分母が0になるためaの値が演算NGになりますので、if文等で例外規定を設ける必要があります。 例えば、a1を求める式を if(xa=xb,10000000000000,(ya-yb)/(xa-xb)) のようにすればいいのですが、これだとABがy軸に平行な直線、CDがx軸に平行な直線となるときに、上に記載したatanの式では-90度になってしまいます。
その他の回答 (5)
- nag0720
- ベストアンサー率58% (1093/1860)
#4です。訂正です。 外積だけで十分でした。 というより、#5の方法でできます。 反時計回りはプラス、時計回りはマイナスになるので場合分けする必要もありません。 α=arcsin(((b_x-a_x)(d_y-c_y)-(b_y-a_y)(d_x-c_x))/|AB||CD|) で求められます。
- muturajcp
- ベストアンサー率78% (508/650)
A(a_x,a_y),B(b_x,b_y),C(c_x,c_y),D(d_x,d_y) α=θπ/180とすると (B-A,D-C)=|AB||CD|cos(α) |AB|^2|CD|^2(sinα)^2=|AB|^2|CD|^2-(B-A,D-C)^2 =((b_x-a_x)(d_y-c_y)-(b_y-a_y)(d_x-c_x))^2 sinα=±((b_x-a_x)(d_y-c_y)-(b_y-a_y)(d_x-c_x))/|AB||CD| ABを基準にCDが反時計まわりに位置する場合は 0≦α≦π/2 , 0≦sinα≦1だから sinα=((b_x-a_x)(d_y-c_y)-(b_y-a_y)(d_x-c_x)) /√(((b_x-a_x)^2+(b_y-a_y)^2)((d_x-c_x)^2+(d_y-c_y)^2)) θ=(180/π)*arcsin ( ((b_x-a_x)(d_y-c_y)-(b_y-a_y)(d_x-c_x)) /√(((b_x-a_x)^2+(b_y-a_y)^2)((d_x-c_x)^2+(d_y-c_y)^2)) )
お礼
回答ありがとうございます。 せっかくの回答ですが、場合分けするのは大変なので、 自動判別できる方法がいいのです。
- nag0720
- ベストアンサー率58% (1093/1860)
角度は内積で、方向は外積で判断できます。 三次元ベクトルとみなして外積を計算すれば、z成分の符号で反時計回りか時計回りかが決まります。
お礼
なるほど、いい案ですね。 ありがとうございます。
- 178-tall
- ベストアンサー率43% (762/1732)
まず思いつくのは、AからBへのベクトルと、CからDへのベクトルとの内積を使う手。 細かいご注文も何とかなるでしょうね。 では。
補足
内積を用いますとcosθを求めることになり+と-の概念が取り除かれてしまいます。 if関数で+と-を分けられればいいのですが、何か案はありますか?
- embramble
- ベストアンサー率56% (14/25)
逆に質問させてください。 ABとCDが直交するケース、例えばA=(1,1)、B=(-1,-1)、C=(-1,1)、D=(1,-1)とする場合、ABを基準に反時計回りにしても時計回りにしても90度でCDに一致しますが、この場合+ですか?-ですか? また、AB、CDというのは線分ですか?それともABまたはCDを通る直線ですか? あと、ご質問中の+と-でどちらも反時計回りと起債しておりますが、片方は時計回りの間違いかと思います。
補足
記述ミスがありました。すみません。 反時計回りで-、時計回りで+でお願いします。 90°の場合は取り除いてください。 線分を想定しいます。
お礼
回答ありがとうございます。 線分でも直線でもどちらでも良いと考えていたのですが、 なるほど、直線の傾きを使えば確かにいけますね。 ABまたはCDがx軸に対して直交するような場合はおそらくありませんので if関数を使わずともいけそうです。 ありがとうございました。