1

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

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

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

基底自体は、それが正規直交である限り問題ではありません。つまり、GNU Scientific Library のフレームワーク内で、次の 2 つのことを行う必要があります。

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

(2) 平面上への P の頂点の射影のこの基準で座標を見つけます。

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

4

3 に答える 3

2

私は GSL を使用していませんが、内積、クロス積、および正規化を使用するだけで結果が得られます。

(1) uの倍数でない任意のベクトルrを選択します。v = rとuの正規化された外積します。w = uvの外積とます。あなたの正規直交基底ベクトルはvwです。

(2) 頂点aをこの平面に投影するには、 ( a dot v ) * v + ( a dot w ) * wです。( v座標ドットvw座標ドットw )

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

于 2010-08-01T18:22:39.267 に答える
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 が点の場合、Pv と Pu は、原点を通って u に直交する平面に射影された P の座標です。

于 2010-08-03T11:04:52.537 に答える
1

この質問には、1 つの情報、つまり基底ベクトルの 1 つの方向が欠けています。質問は、基底ベクトルが正規直交 (つまり、単位長で互いに垂直) であり、もちろん u に垂直でなければならない (それらは u に垂直な平面にあるため) と述べていますが、それでも u を中心に任意の角度まで自由に回転できます。 .

于 2010-08-01T18:43:31.143 に答える