アプリ版:「スタンプのみでお礼する」機能のリリースについて

ある1つのn次元ベクトルに対する正規直交基底ベクトル(無限に存在すると考えられます)をいくつか求めたいのですが、どのようなプログラムを作れば良いのか分からず困っています。どなたか教えて頂けないでしょうか。よろしくお願いします。

A 回答 (4件)

多分、"あるベクトル"も任意に指定出来るのですよね?


かつnを3とする前提で説明させて下さい。最も想像し易い為です。故に正規直交基は、3本のベクトル(接線t/従法線b/主法線n)で構成されます。具体的な方法は、下記の通りです。

(1) "あるベクトル"をtと見立てる。
(2) 補助ベクトルaを作る。例えば、a( (float)rand(), (float)rand(), (float)rand() )のように乱数で作る。この時、零ベクトルにならないように注意。
(3) b = t x a(xは外積) でbを作る。
(4) n = t x b(xは外積) でnを作る。
(5) t,b,nを正規化する。

これでどうでしょう?t,b,nは解の条件を満たしているはずです。乱数を使っている為 結果が定まりません。が、とっかかりとしてはOKでしょう。又、実行する度に、「無限に在る正規直交基の1つを、無作為に生成」します。

この方法はあくまで解の1つです。他にも良い方法があると思います。では、頑張って下さい。
    • good
    • 0
この回答へのお礼

分かりにくい質問に対して非常に分かりやすい回答ありがとうございました.本当に助かりました.さっそくプログラムを書いてみたいと思います.

お礼日時:2005/10/11 21:05

補足です。

(2)の「任意の変換行列」は、
「"変換後も直交性を維持出来る"任意の変換行列」
です。従って、零変換やせん断変換はダメです。
    • good
    • 0
この回答へのお礼

丁寧に教えていただいてありがとうございます。こちらの質問の仕方が間違っていて分かりづらくなってしまい申し訳ないです。
質問ですが、「ある1つのn次元ベクトルに直交する部分空間の、任意の正規直交基底ベクトルを求めたい」というものなのですが、どうでしょうか?
よろしくお願いします。

お礼日時:2005/10/11 18:52

(1) n次の単位行列を作る


(2) (1)に軸i(iの定義域は[1,n])に関する任意の変換行列(回転、拡大等)を掛ける。又、複数軸やっても良い
(3) (2)の各行(軸)ベクトルを正規化。かつそれら(接線、従法線、主法線)を抽出

これでお望みの結果を出せると思います。
(1)の段階で、既に正規直交基です。(2)はそれを無限種に変換します。(3)は、(2)で失われたかもしれない正規性を回復させます。

詳しくは、市販の 線形代数/3DCG幾何 に関する本を読んで下さい。

あと問題文が意味不明です。条件指定が不備だからです。「ある1つのn次元ベクトルに対する正規直交基底ベクトル」ではなく、「ある任意のn次正規直交基を構成する各ベクトル」ではないでしょうか?
    • good
    • 0

正規直交基底ベクトルって何? 基底はあくまでベクトルの集合で一つのベクトルだけ取り出しても意味ないと思うよ。


そもそも普通に座標空間で考えると基底は自明なものがあるんだし、もう少し問題を明確にしないとプログラミング言語でどうこうなんてできないでしょ。
    • good
    • 0

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