痔になりやすい生活習慣とは?

空間座標内の3点A(a1,a2,a3),B(b1,b2,b3),C(c1,c2,c3)で定義される三角形の∠BACを求めたいのですが、どのような方法があるでしょうか。できれば、AからBへ向かう辺を角度ゼロとして、三点の座標を入力するだけで(ベクトルの正規化等を用いず)∠BACを0度~360度の値(ラジアンでもいいです)で返すような式が欲しいです。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

計算 内積」に関するQ&A: ベクトル 内積計算

A 回答 (2件)

空間座標でも、角度を求めるときは平面座標と同じ次の公式を使えます。



※AB, ACはベクトル
cosθ = (AB・AC) / (|AB|*|AC|)

次のように計算すればいいでしょう。ただし、cosθからθを求める関数(アークコサイン関数)が必要です。

∠BAC を θ とおきます。

AB = (b1-a1, b2-a2, b3-a3)
AC = (c1-a1, c2-a2, c3-a3)
|AB| = √((b1-a1)^2 + (b2-a2)^2 + (b3-a3)^2)
|AC| = √((c1-a1)^2 + (c2-a2)^2 + (c3-a3)^2)
AB・AC = (b1-a1)*(c1-a1) + (b2-a2)*(c2-a2) + (b3-a3)*(c3-a3)
cosθ = (AB・AC) / (|AB| * |AC|)
θ = cos^(-1)θ ←アークコサイン関数

これを一つの式にまとめれば一発で計算できます。

この回答への補足

さっそくの回答、ありがとうございます。
上記の式が返すθは、0≦θ≦πだと思うのですが、
0≦θ≦πと、π≦θ≦2πの区別は、A,B,Cの座標で判別可能なのでしょうか?

補足日時:2006/07/24 21:14
    • good
    • 0

#1さんのような内積を使って「角度」を定義するのが一般的です。

ですので、普通は、角度は0°から180°の範囲になります。

2次元平面で360°までの角度が自然に定義できるのは、むしろ、例外です。
3次元空間も含めて、普通は、0°から360°の角度を定義しようとすると、どう頑張っても「不自然」な定義になってしまいます。(それでも、というのであれば、角度の定義を補足してください)

------------------------------------------------
参考程度。

A(0,0,0),B(1,0,0)とします。
C(0,1,0)の時の∠BACの値
C(0,-1,0)の時の∠BACの値
それぞれいくつになると考えますか?

おそらく、答えは「両方とも90°(あるいは270°)」か「一方が90°で他方が270°」のどちらかだと思います。

・「両方とも90°(あるいは270°)」と考える場合:
∠BAC=270°(あるいは90°)となるような具体例を考えてみてください。

・「一方が90°で他方が270°」と考える場合:
Cがyz平面の単位円をぐるっと一周する(途中で点(0,1,0)と点(0,-1,0)を通ります)時、∠BACがどのように変化するのかを考えてみてください。

角度の範囲を0°から360°で定義しようとすると、こういう変なことになるので、「不自然」と書きました。
    • good
    • 1
この回答へのお礼

ありがとうございました、解決です!

お礼日時:2006/07/24 22:38

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q三次元空間の3点のなす角度

三次元空間の3点のなす角度を知る公式が知り無たいのです。直交座標で、3点の x, y, z 座標値はわかっているものとします。

自分でいろいろ考えたのですが、かなりややこしくなってしまいこれは公式を見つけないとだめだなと思いました。よろしくお願いします。

Aベストアンサー

3点をA(a1,a2,a3),B(b1,b2,b3),C(c1,c2,c3)とします.
ベクトルAB,ベクトルAC,ベクトルBCを算出します.
そうすると三角形ができます.
あとは知りたい角をθと置いて,余弦定理を使ってcosθを求めます.
求まったcosθの値からθを求めましょう.

Q二点の座標から角度を求めるには?

2点の座標A,Bの角度を求めたいのですが,たとえばA点(0,0)とB点(4,3)を結ぶラインは、底辺Bxと高さByを元に三角関数?から30度と求められますが、B点がマイナス座標が絡んできた場合などの90度から359度までをどう求めていいか悩んでいます。また、A点も(0,0)に限定されるわけではないので、ますます混乱しています。どう考えればよいのか教えていただきたいのですが
(水平はX軸プラス方向が0度です)

Aベストアンサー

>2点の座標A,Bの角度を求めたい~・・・・

このままなら答えは0ですけど?

xy座標で、x軸のプラス方向を0度とし、
2点の座標A、Bにより形成される線ABとx軸との角度
ってことですね。

>たとえばA点(0,0)とB点(4,3)を結ぶラインは、底辺Bxと高さByを
>元に三角関数?から30度と求められますが、

sen-senさんの書かれたとおり、これは間違いです。
この場合、Bからx軸へのばした垂線とx軸との交点をCとすると、
三角形ABCができ、そのときの求めたい角度をθとすると、
tanθ=3/4となります。
よって、θ=36.8698...
となります。

>B点がマイナス座標が絡んできた場合などの90度から359度までを
>どう求めていいか悩んでいます。また、A点も(0,0)に限定される
>わけではないので、ますます混乱しています。
>(水平はX軸プラス方向が0度です)

常にx軸のプラス方向が0度でしたら、
1.第一象限にある場合は90度足す。
2.第二象限にある場合はそのまま。
3.第三象限にある場合は270度足す。
4.第四象限にある場合は180度足す。
とすればいいのでは?

簡単な例として、x軸と点A(0,5)と点B(-3,7)によって形成される
線ABとの間の角度は・・・・

まず、図を描いてみると点Bは第一象限にあるので、
最後に求めた角度に90度足せばいいだけです。
さっきと同じように直角三角形を作成します。
すると点Cの座標は(0,7)となります。
辺ABと辺ACとの間の角度は、tanθ=3/2
θ=56.3
以上より、x軸(に水平な線)と線ABとの間の角度は146.3度となります。

こんな感じでいいのでは?

>2点の座標A,Bの角度を求めたい~・・・・

このままなら答えは0ですけど?

xy座標で、x軸のプラス方向を0度とし、
2点の座標A、Bにより形成される線ABとx軸との角度
ってことですね。

>たとえばA点(0,0)とB点(4,3)を結ぶラインは、底辺Bxと高さByを
>元に三角関数?から30度と求められますが、

sen-senさんの書かれたとおり、これは間違いです。
この場合、Bからx軸へのばした垂線とx軸との交点をCとすると、
三角形ABCができ、そのときの求めたい角度をθとすると、
tanθ=3/4...続きを読む

Q座標を入力すると角度を得られるような方法

エクセルとを使って、例えば(0.5、√3/2)等を
入力すると60°を得られるような方法はありますか?

PCはあまりくわしくないのでどうか解りやすくお願いします。
m(_ _)m

Aベストアンサー

三角関数は苦手ですなぁ。(^^;;;

A1 に X座標
B1 に Y座標が入力されているとして。

C1 に以下の式を入力すると角度が出ます。

=ATAN2(A1,B1)*180/PI()


ATAN2(x座標, y座標)は
xy座標のアークタンジェントを返す関数

PI() はπを返す関数。

以上。

Q3点の緯度経度(XY座標)の角度

皆様、どうかお知恵をよろしくお願いします。

3点がありまして、一点を基準に2点の角度を調べたいのですが、どうしたらよいでしょうか?
A、B、Cと3点あり、AーB間を基準にして、A-C の角度がどれくらいあるかです。いろいろ探してみましたが、うまく見つけられません。なにとぞよろしくお願いします。

なお、三点は緯度経度(もしくは、地図上のXY座標)がわかっております。エクセルで確認できると助かります。

Aベストアンサー

> A、B、Cと3点あり、AーB間を基準にして、A-C の角度がどれくらいあるかです。

これは下図のθを求めたいということでしょうか?



│       C
│     /
│   /θ
│  A────B

O──────────→X


それから,緯度経度とありますが,平面ではなく球面として扱う必要がある
(AB間,AC間の距離が長い) のでしょうか?

もし平面でよければ↓ここに計算式があります.

3点の座標から簡単に回転方向を判別する.(2次元,外積を用いる方法)
http://www5d.biglobe.ne.jp/~noocyte/Programming/Geometry/RotationDirection.html

もし球面として扱う必要があるのであれば,「球面三角法」で検索してみるといいかも.

Q三角比 傾斜角の求め方を教えてください

画像の傾斜角を求めたい場合、どうすればいいんでしょうか?

できるだけ分かりやすく教えていただけると助かります。
よろしくお願いします。

Aベストアンサー

この手の問題、数学の教科書の最後のページにある三角関数表を使ってもいいのでは??
sinθ=高さ/斜辺
を計算して表を見て応えるじゃだめですか??

Q3次元空間上の2つの座標から角度を求めたい

3次元空間上の2つの座標、 座標A と 座標B から
A -> B の角度を求めるにはどうしたらよいでしょうか?

Pythonでプログラムを組んでいるのですが調べてもイマイチ3次元での方法がわからなかったため質問しました。

多分座標Aにオブジェクトがあると仮定した時、
そのオブジェクトを座標Bに向けるというのと同じようなことをすればいいのではと考えて
調べているのですがわかりません。

2次元ではatanを利用すれば出来るようなのですが
3次元の方法がわからなかったため質問しました。

座標A:(xA, yA, zA)
座標B:(xB, yB, zB)

求めたい結果:Rotation(xR,yR,zR)

空間的には

+X 左
+Y 上
+Z 正面

になっています。

Pythonの方法でなくても言語などは問わないので分かる人教えて下さい。
よろしくお願いします。

Aベストアンサー

あなたが期待しているのは、どんな結果なのですか?
「これで近い向きにはなっていますがやはりずれています」とは、どんな方法で確認したものなのでしょうか?


A(5,5,5) から B(10,10,10)への角度は
B-A=(10-5,10-5,10-5) = (5,5,5) のベクトルと並行な角度になります。
角度をこのままX,Y,Z座標で表す方法もあります。
大きさで割った 単位ベクトル を角度として使用することもあります。

平面なら角度は1つで済みますが、立体では2つ必要です。
X-Y平面上でどの向きかを示す「方位角」 と 上下にどのくらいかの「仰角」の組合せはよく使われます。

(5,5,5)ベクトルの方位角は45度、仰角は35.26...度 で、合ってます。



何に使ってるかわかりませんが、Vector3D[0]が方位角、Vector3D[2]に仰角、って使い方が間違っているということは無いですか?

Qsinやcosから角度を・・

テスト勉強でsin(0.3)で角度が、19.45度となる答えがありました。
同じくcos(0.769)で角度が、39.7度となっていました。
この、sinやcosの数値からどうやって角度を求めるのでしょうか?

関数電卓でもその方法わかりません。
手計算でも求められるのでしたら、その方法を教えていただけないでしょうか?

Aベストアンサー

> sin(0.3)で角度が、19.45度となる答えがありました。
答えが間違っています。
arcsin(0.3)[rad]=arcsin(0.3)*180/π[度]≒17.46[度]

> cos(0.769)で角度が、39.7度
arccos(0.769)*180/π[度]≒39.74[度]

sinの逆関数がarcsin(アークサイン)
 y=sin(x)ならx=arcsin(y)
cosの逆関数がarccos(アークコサイン)
y=cos(x)ならx=arccos(y)
関数電卓も色々
Inv+sin でarcsin の計算をするもの(Windows内蔵の関数電卓)
sin-1 がある電卓なら、ずばりarcsinが計算できるもの
Asin でarcsinを計算する関数になっているもの
色々だね。
また
rad(ラジアン)を度にするには 180/πを掛ければ良い。
度をrad(ラジアン)にするには  π/180を掛ければ良い。

Q3次元座標を原点中心に回転したい

任意のゼロでないベクトル(a,b,c)を原点中心に回転し、z軸に合致させるとする。同じ回転移動を3次元座標上の任意の点(x,y,z)に対して行った時の移動後座標が知りたいのです。

計算と結果を教えて下さい。

Aベストアンサー

A No. 1 です。補足。

「回転行列」
http://www.cg.info.hiroshima-cu.ac.jp/~miyazaki/knowledge/tech07.html

ロドリゲスの公式もあります。

Q任意の面内にある点の座標から面の傾きを求める方法を教えて下さい。

任意の面内にある点の座標から面の傾きを求める方法を教えて下さい。

XYZ軸で構成される3次元空間があります。
そこに面Aが存在するとします。
この面Aの傾きを求めるためには
面A上にある座標、a(x1,y1,z1),b(x2,y2,z2),c(x3,y3,z3)の3点が分れば
傾きは求まるかと思います。
(実際は任意のxyの位置にある面Aの高さzを求めてa,b,cを決める)

この面を水平に補正しようとする場合の
x軸周りに?度、y軸周りに?度というのを求めたい場合
どのようにすればよいのでしょうか?

また実際は面Aにもたわみがありますので
もっとたくさんの点で面Aの高さを求め、
そこからx,y軸周りの傾きを近似する必要がありますが
その場合もどのようにすればよいのでしょうか?

ご回答、または参考サイトをお教えいただきたいと思います。

Aベストアンサー

#1です。補足します。
#1にて書いた通り私は詳細まで説明出来ません。直線近似については、直線を設定して各点と直線の距離の和が最小になるように傾きと切片を決定します。平面についても同じ原理です。各点と平面の距離が最小になるよう法線ベクトルと通過点を決定します。

Q3次元の座標変換と角度について。

3次元のシミュレーションの勉強をしています。

3次元の座標変換で
x,y,z:変換前の座標;
x',y',z':変換後の座標;
θ:回転する角度;
lx,ly,lz:平行移動量;
としたとき、

X軸に関する回転
             |10   0    0|
             |0cosθ sinθ 0|
[x' y' z' 1] = [x y z 1]|0-sinθ cosθ0|
             |00   0   1|
Y軸に関する回転
             |cosθ0-sinθ0|
             |0   10   0|
[x' y' z' 1] = [x y z 1]|sinθ0cosθ0|
             |0   00   1|
Z軸に関する回転
             |cosθ sinθ 00|
             |-sinθcosθ00|
[x' y' z' 1] = [x y z 1]|0   0   10|
             |0   0   01|
平行移動
             |10 0 0|
             |01 0 0|
[x' y' z' 1] = [x y z 1]|00 1 0|
             |lxly lz 1|

物体の姿勢を表現するときは
[物体の姿勢の変換行列] = [Z軸の回転行列][X軸の回転行列][Y軸の回転行列][平行移動]
 |XX XY XZ 0|XX,XY,XZ・・・X軸の単位ベクトルを変換した場合のベクトル
 |YX YY YZ 0|YX,YY,YZ・・・Y軸の単位ベクトルを変換した場合のベクトル
= |ZX ZY ZZ 0|ZX,ZY,ZZ・・・Z軸の単位ベクトルを変換した場合のベクトル
 |LX LY LZ 1|LX,LY,LZ・・・平行移動量ベクトル

というのは分かるのですが、
X軸、Y軸、Z軸の単位ベクトルを変換した後のベクトルから
X軸、Y軸、Z軸にそれぞれ何度ずつ回転させたかを求めるにはどのようにすればよいのでしょうか?

つまり、X軸に対して30度、Y軸に対して45度、Z軸に対して60度回転させた後の
|XX XY XZ 0|
|YX YY YZ 0|
|ZX ZY ZZ 0|
|LX LY LZ 1|
の値からX軸に対して30度、Y軸に対して45度、Z軸に対して60度回転している事を導きたいのです。

分かる方教えてください。
お願いします。

(質問に関して、
http://www.ceres.dti.ne.jp/~ykuroda/oyaj/bone/basic3d.html
を参考にさせていただきました。)

3次元のシミュレーションの勉強をしています。

3次元の座標変換で
x,y,z:変換前の座標;
x',y',z':変換後の座標;
θ:回転する角度;
lx,ly,lz:平行移動量;
としたとき、

X軸に関する回転
             |10   0    0|
             |0cosθ sinθ 0|
[x' y' z' 1] = [x y z 1]|0-sinθ cosθ0|
             |00   0   1|
Y軸に関する回転
             |cosθ0-sinθ0|
             |0   10   0|
[x' y' z' 1] = [x y z 1]|si...続きを読む

Aベストアンサー

3次元回転は非可換のため
各軸に対する回転の順序を1通りに決めて
各軸1回ずつの回転として
移動拡大縮小は一切しないと
しない限り結果行列から各軸に対する回転角度は
求められません。
x軸に対しての回転角t
y軸に対しての回転角u
z軸に対しての回転角v
(z軸周回転行列)*(y軸周回転行列)*(x軸周回転行列)の順序で左から
縦ベクトル
(x)
(y)
(z)に対して
x軸周回転,y軸周回転,z軸周回転の順序で回転行列を乗じるもの
とすると回転行列は
(cosv,-sinv,0)(cosu,0,-sinu)(1, 0, 0)
(sinv, cosv,0)( 0,1, 0)(0,cost,-sint)
( 0, 0,1)(sinu,0, cosu)(0,sint, cost)
=
(cosvcosu,-cosvsinusint-sinvcost,-cosvsinucost+sinvsint)
(sinvcosu,-sinvsinusint+cosvcost,-sinvsinucost-cosvsint)
( sinu, cosusint, cosucost)
=
(a_xx,a_xy,a_xz)
(a_yx,a_yy,a_yz)
(a_zx,a_zy,a_zz)
となり
[
(a_xx)^2+(a_yx)^2+(a_zx)^2=1
(a_zx)^2+(a_zy)^2+(a_zz)^2=1
(a_xy){1-(a_zx)^2}+(a_xx)(a_zx)(a_zy)+(a_yx)(a_zz)=0
(a_xz){1-(a_zx)^2}+(a_xx)(a_zx)(a_zz)=(a_yx)(a_zy)
(a_yy){1-(a_zx)^2}+(a_yx)(a_zx)(a_zy)=(a_xx)(a_zz)
(a_yz){1-(a_zx)^2}+(a_yx)(a_zx)(a_zz)+(a_xx)(a_zy)=0
]の条件のとき
y軸に対しての回転角
u=arcsin(a_zx)
z軸に対しての回転角
v=arccos[a_xx/√{1-(a_zx)^2}]
x軸に対しての回転角t
t=arccos[a_zz/√{1-(a_zx)^2}]

3次元回転は非可換のため
各軸に対する回転の順序を1通りに決めて
各軸1回ずつの回転として
移動拡大縮小は一切しないと
しない限り結果行列から各軸に対する回転角度は
求められません。
x軸に対しての回転角t
y軸に対しての回転角u
z軸に対しての回転角v
(z軸周回転行列)*(y軸周回転行列)*(x軸周回転行列)の順序で左から
縦ベクトル
(x)
(y)
(z)に対して
x軸周回転,y軸周回転,z軸周回転の順序で回転行列を乗じるもの
とすると回転行列は
(cosv,-sinv,0)(cosu,0,-sinu)(1, 0, 0)
(sinv, cosv,0)( 0,1, ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング