🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

7095閲覧

Pythonで3点の座標から0°~360°の範囲で角度のみを求める方法

Hacchi_

総合スコア25

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/12/23 00:10

編集2020/12/23 01:28

イメージ説明

Pythonで,図のように3次元空間上の3点の座標から片側の角度(図中の∠B)のみを求める方法を模索しています.

具体的に説明します.
図のように,点ABCの座標がわかっており,3点が点Bにおいてなす角度を求めたいと思っております.
このとき,3点が点Bにおいてなす角度は,図のように内側と外側の2種類の角度があると思います.
このとき,片方の角度を∠B,もう片方を∠B’とします.
点ABCがそれぞれ移動するとき,変化する∠Bの角度をを0°~360°まで求めたいのですが,私が実装した方法(以下に記載)ですと,0°~180°の範囲でしか角度を求めることが出来ません.(常に鋭角が計算されるため,180°を超えることがありません.)

3次元空間上において,移動する3点がなす角の片側のみを0°~360°の範囲で計測するには,どのように実装すれば良いのでしょうか?
(∠Bと∠B’のうち,最初に180°より小さい方の角度を∠Bとして,0°~360°の範囲で変化する∠Bの角度を常に追跡し続けるイメージです)

以下に,私が実装した角度の算出方法を載せます.

python

1 2 a = np.array([0,1,2]) 3 b = np.array([10,20,30]) 4 c = np.array([5,7,9]) 5 6 vec_a = a - b 7 vec_c = c - b 8 length_vec_a = np.linalg.norm(vec_a) 9 length_vec_c = np.linalg.norm(vec_c) 10 inner_product = np.inner(vec_a, vec_c) 11 degree = np.rad2deg(np.arccos(inner_product / (length_vec_a * length_vec_c))) 12

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2020/12/23 00:38 編集

∠Bと∠B’はどうやって区別するのですか? 多分こうしたいんだろうなっていうのは推測はしてますが、 ちゃんと言語化するのは大事だと思うので書いてみてください。 説明できそうになければそう言ってください。
Hacchi_

2020/12/23 00:46 編集

区別する1つの方法としては,計測開始時点で鋭角である方を∠B,鈍角である方を∠B’とする方法があるかと思います.(逆でも問題ありませんが)
ozwk

2020/12/23 01:03

鋭角って0度~90度のことをいうので、なす角が180度より小さい方でいいですね?
Hacchi_

2020/12/23 01:27

すいません,間違っていました. おっしゃるとおり,180度より小さい方です.
ozwk

2020/12/23 01:32 編集

ちょっと頭の中で180度になるように動かした上でまた曲げてみてください どっちが∠Bですか? 区別つきませんね? って趣旨の回答がすでについてしまいました
jbpb0

2020/12/23 01:48

挙げている図の次の測定で、点Bがすごく右(点A~点Cを通る直線よりも右)にずれてたとします その状態は、たとえば下記の二通りのどちらでも起きます ・点A~点Cを通る軸の周りを点Bが回転した ・点Bが右方向に直線移動した 前者ならば∠B<180°のままですが、後者ならば∠B>180°になります なので、3点の座標の変化だけでは、∠Bと∠B’は区別できないので、区別するための別の条件が要ると思います 測定間ではそんなに点は大きくは動かない、って思われたとしても、∠Bが180°に近ければ、ちょっと点が動くだけで上記の状態になりますよね
jbpb0

2020/12/23 01:56

ppaulさんのように地球を使って例えると、点Aが北極点、点Cが南極点、点Bが日本のどこかだとします 次の測定では、点Bがアメリカのどこかでした 点Bが、地球の表面に沿って日本→アメリカに移動した場合は、∠B<180°のままです 点Bが、地球の中に日本とアメリカを直線でつなぐトンネルを掘って、そのトンネルを通って日本→アメリカに移動した場合は、∠B>180°になります そんなトンネル掘れないだろ、とか突っ込まないでください あくまでも例えなので
guest

回答1

0

使用言語(pythonとかC/C++)に関係なく、回答は存在しないように思います。
それは、問題を定義することができないからです。

地球の表面を移動する飛行機を考えてください。

点Aを北極(北緯90度)、点Bを地球の中心とします。飛行機の位置が点Cです。

点Cが東経0度、北緯0度を出発したとき、角度は90度です。
点Cが東経0度のまま真っ直ぐ南に南下して南極(南緯90度)に到達すると、角度は180度になります。

期待する答えは、そのまま東経180度で北上したときには180度以上の角度にしたいということなのでしょう。
そして、東経45度で北上したときには180度以下の角度にしたいのでしょう。

では、東経90度で北上したときには、180度以上ですか、それとも180度以下ですか。

投稿2020/12/23 01:27

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問