質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

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

Q&A

解決済

3回答

720閲覧

三次元空間上の平面に対して、ある点から垂直に下した点の座標の求め方

porcupine

総合スコア2

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

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

0グッド

1クリップ

投稿2021/11/28 13:59

三次元空間上の点A, B, C を含む平面があり、
同三次元空間上の点P から上記の平面に対して垂直に下した点Qを求めたいです。

点A, B, C, P の座標を入力すると、点Q が求まる python のモジュールが
もしあれば教えていただきたいです。
もしくは、numpy などを使っての具体的な計算方法をお教えいただきたいです。

与えられているもの・条件:
・点A, B, C, P の各 (x, y, z)座標
・点A, B, C, Q は同一平面上
・直線PQ と ABC平面は直行
求めたいもの:
・このときの 点Q の (x, y, z)座標

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

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

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

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

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

guest

回答3

0

ベストアンサー

sympy.geometry.plane.Plane.projection

python

1from sympy import Plane, Point3D 2 3A = Point3D(2, 1, 0) 4B = Point3D(1, 0, 1) 5C = Point3D(0, 1, 2) 6P = Point3D(1, 3, 7) 7Q = Plane(A, B, C).projection(P) 8 9print(Q) 10print(Q in Plane(A, B, C)) 11 12# 13Point3D(-2, 3, 4) 14True

投稿2021/11/28 18:45

melian

総合スコア19874

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

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

退会済みユーザー

退会済みユーザー

2021/11/28 19:00

こんな便利なのがあるんですね。Q in Plane(A, B, C) がちゃんとTrueを返してくれるのが素敵
porcupine

2021/11/29 16:20

具体的なご回答ありがとうございます。
guest

0

射影行列を使ったアプローチの概要と参考になるWebページを回答します。

  • 点Aを原点Oと見なしたときの、B、C、P、Q の座標をB', C', P', Q' とする。以後、点AをOと書く。
  • ベクトルOB'をb, ベクトルOC' をc、ベクトルOP'を x 、ベクトルOQ' をy とする。
  • bc を横に並べた(3行2列の)行列を K = (b, c) とする。
  • このとき、xy に写す射影行列 (Projection matrix)は

      = K ( **K**t K )-1 **K**t --------- (※)

で与えられる。(ただし、 **K**t は K の転置行列, また -1 は逆行列を表す。)

  • したがって、上記の**を作って、y=** x を計算し、yに対してベクトルOA分の移動を戻すことで、求めるQの座標が得られる。

式(※)の導出は、線形代数の教科書では、直交行列だったり直交補空間についての章の中で「射影」として一節設けてあったりする内容かと思います。このあたりをウェブで読めるサイトですと、以下にて上記の式(※)の導出と、numpy およびscipy.linalg によるサンプルコードがあります。

なお上記リンク先のページ内では、この回答の説明に使った行列 KA と書いており、式(※) に相当するのは、同ページ内の式(23)で、式(23)のすぐ下に、SciPy で射影行列を計算するコードが挙げられています。

投稿2021/11/28 17:13

編集2021/11/28 17:50
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

porcupine

2021/11/29 16:19

リンクのサンプルコードで、 点A, B, C, P の座標をどこに当てはめればいいのか、自分には分からなかったです…
guest

0

具体的な計算方法

ふつーに計算すればよいのではないでしょうか.

  1. A,B,Cが乗る平面の法線Nを求める.

(A->B と A->C の外積あたりから)
2. A->P の N 方向成分を求む.
(A->P と N との内積から)
3. A->P から A->P のN方向成分を除去した結果が A->Q である.

投稿2021/11/28 14:17

fana

総合スコア11708

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

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

fana

2021/11/29 01:37

※言うまでも無いだろうけど, A->Q が得られたならば,Qの座標は A + (A->Q) である.
porcupine

2021/11/29 16:17

考え方はよくわかりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問