1


0

C / C ++のGSLを使用したポリゴンの平面への投影

一般的な問題は、多角形を平面に投影することは広く解決されていますが、私の特定のケースについて誰かが提案できるかどうか疑問に思っていました。

3空間に平面ポリゴンPがあり、単位ベクトルuに直交する原点を介して平面に投影したいと思います。 Pの頂点とuの座標は、私が持っている唯一のデータです(すべてw.r.t. R ^ 3の標準ベース)。

ただし、投影された座標だけが必要なわけではありません。 実際に、uに直交する平面の正規直交基底を見つけてから、この新しい基底で投影された頂点の座標を見つけたいと思います。

基礎自体は正規のものである限り重要ではありません。 ですから、本当にGNU Scientific Libraryの枠組みの中で2つのことをする必要があります:

(1)単位ベクトルuに直交する均質平面の2つの正規基底ベクトルを見つけます。

(2)Pの頂点の平面への投影のこの基底の座標を見つけます。

gslを使用してこれを行う方法に関するアイデアはありますか?

3 Answer


2


GSLを使用したことはありませんが、ドット積、クロス積、正規化を使用するだけで結果が得られます。

(1)* u の倍数ではないベクトル r を選択します。 * v * = * r *と u の正規化された外積とします。 * w * = * u *と v のクロス積とします。 正規直交基底ベクトルは v および w *です。

(2)このプレーンに頂点* a を投影するには、( a ドット v * v * +(* a ドット w * w です。 ( v 座標は a ドット v w 座標は a ドット w *です)

これがどのように機能するかを考えるには、* u * = <1,0,0>および* r * = <3,0,5>を選択して開始し、3次元ベクトルを視覚化します。


1


問題は、1つの情報、つまり基底ベクトルの1つの方向が欠落していることです。 質問では、基底ベクトルは正規直交(つまり、単位長さおよび互いに垂直)であり、もちろんuに垂直でなければならない(それらはuに垂直な平面にあるため)が、それでもuの周りを自由に回転できる。


1


u、v、wが正規直交基底となるようにベクトルvとwを計算するには:

void    make_basis3( const double* u, double* v, double* w)
{  double   h[3];
double  d;
double  s = ( u[0] > 0.0) ? 1.0 : -1.0;
double  f = s/(s+u[0]);
h[0] = u[0]+s;  h[1] = u[1]; h[2] = u[2];
d = f*h[1]; v[0] = -d*h[0]; v[1] = 1.0-d*h[1]; v[2] = -d*h[2];
d = f*h[2]; w[0] = -d*h[0]; w[1] = -d*h[1]; w[2] = 1.0-d*h[2];
}

ここで、uは長さ1であると想定されます。

ここで行われているのは、最初の数行でベクトルhを計算し、hに基づく世帯主行列(つまり、Q = I-2 * h * h '/ h' * h(ここで、 'は転置)はuを(+- 1,0,0)と最後の2行は、この行列を(0,1,0)に適用してvを取得し、(0,0,1)に適用してwを取得します。 Qは直交で対称なので、u、v、wは正規直交基底です。

この方法は、クロス積を使用するよりも好ましいと思います。なぜなら、より短く、より効率的で、丸め誤差の影響を受けにくく、より高い次元に一般化されるからです。

Pが点の場合、P.vとP.uは、原点を介してuに直交する平面に投影されたPの座標です。