プロが教えるわが家の防犯対策術!

こんにちは。
以前、三角形についての質問をさせて頂き、三角形の3点を移動させられるようになりました。
そこで、辺の長さの求め方も教えて頂きました。

今回の質問は「三辺の長さから角度を求める方法を教えて欲しい」というものです。
「辺の長さから角度」と思いつき、余弦定理を思い出したのですが、元々うろ覚えだった為に実装する事が出来ないで居ます・・・。
分かる方、教えていただけませんか?

三角形ABCの3辺をそれぞれabcとして余弦定理に当てはめると
cosA = (b*b)+(c*c)-(a*a) / (2*b*c)
というようにして求められると思ったのですが・・・。

A 回答 (2件)

2辺から角度を求めるには内積を使います


三角を以下のように3点として、p0の角度(θ)を求めたいとします
   p0
   /\
  /  \
 /    \
p1 ̄ ̄ ̄ ̄ ̄ ̄p2

cos(θ)=(p1-p0)・(p2-p0)/(p1-p0の長さ)/(p2-p0の長さ)
※p1-p0の計算結果はベクトルです
※p2-p0の計算結果はベクトルです
※・は内積を求める意味です
※p1-p0、p2-p0のベクトルを正規化(長さ1にする事)すれば前述の式は
 cos(θ)=(p1-p0)・(p2-p0)
 と非常に簡単になります
 これを使えば
 θ=acos(p1-p0)・(p2-p0)
 p1-p0=>q、p2-p0=>rとして
 θ=acos(q.x*r.x + q.y*r.y)
※acosはアークコサインの意味
※acosで求めた結果はラジアンなので 180/3.141592をかければデグリーになります
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
ベクトルはかなり苦手だった覚えがあるのですが、試行錯誤の末、角度の表示に成功しました。
ついでに面積も表示させるようにして、三角形シリーズは無事完成しました。
本当にありがとうございました。

お礼日時:2008/10/30 22:40

プログラミングはあまり詳しくないですが失礼します。



余弦定理をつかえば三辺の長さからcosの値を求めることが可能です。
というか、そこまでわかってるならやってみればいいんじゃないかと思うんですが。

ちなみに、cosAの値がわかってもそのままだと角度はわかりませんので、
アークコサインを使って角度を求めます。

この回答への補足

記述した内容から角度を求める為の式を抜き出したものです。

//三点を作成、設定をする
for(n=1;n<=3;n++){
make = _root.attachMovie("point","point"+n,n);
make.onPress = function(){
startDrag(this,true);
}
make.onRelease = function(){
stopDrag();
}
}
onEnterFrame = function(){
_root.clear();
//座標を変数に
Ax = _root.point1._x;
Ay = _root.point1._y;
Bx = _root.point2._x;
By = _root.point2._y;
Cx = _root.point3._x;
Cy = _root.point3._y;
//線の描画
_root.lineStyle (0, 0x000000, 100);
_root.moveTo(Ax,Ay);
_root.lineTo(Bx,By);
_root.lineTo(Cx,Cy);
_root.lineTo(Ax,Ay);
//それぞれの線分の長さを表示する
a = Math.sqrt((Bx-Ax)*(Bx-Ax)+(By-Ay)*(By-Ay));
b = Math.sqrt((Cx-Bx)*(Cx-Bx)+(Cy-By)*(Cy-By));
c = Math.sqrt((Ax-Cx)*(Ax-Cx)+(Ay-Cy)*(Ay-Cy));
//小数点第2位以下を切り捨てる
trace("aの長さは"+Math.floor(a*10)/10);
trace("bの長さは"+Math.floor(b*10)/10);
trace("cの長さは"+Math.floor(c*10)/10);
//cosAを算出する
trace("角Aの数値は"+((b*b)+(c*c)-(a*a)) / (2*b*c));
}
//最初に実行
if(isNaN(Ax)){
//初期座標
_root.point1._x = 70;
_root.point1._y = 180;
_root.point2._x = 270;
_root.point2._y = 180;
_root.point3._x = 270;
_root.point3._y = 30;
}

補足日時:2008/10/29 09:27
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
質問に書いた式の通りに実行してみたのですが、計算で出てきたのは全く関係ない数値でした。
90度にしても高さによって数値はバラバラ、コサインを表示しているとはとても思えない状態です。
他の角のコサインを表示しているのかと思って試しましたが、同様に、高さによってバラバラです・・・。

お礼日時:2008/10/29 09:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!