質問

明らかにすべてが特定の平面に落ちる3D空間にデータポイントのセットがあります。 PCAを使用して平面パラメーターを計算します。 PCAの3番目のコンポーネントは、プレーンの法線ベクトルを提供します(最も弱いコンポーネント)。

次に行うことは、すべてのポイントを上記の平面に変換し、2Dで見ることです。

私の考えは次のことをすることでした:

  • 平面上の中心点(平均点)を見つける
  • すべてのデータポイントから減算して、原点の周りに配置します
  • 法線を回転させて、(0,0、-1)になるようにします
  • この回転をすべてのデータポイントに適用する
  • 正射影を使用する(基本的に、z軸をスキップする)

今、正しい回転操作を見つけることができません。私はacosまたはatanを使用して、2つの回転行列を設定してみました。両方の方法(acosを使用、atanを使用)が間違った結果を与えるようです。おそらくあなたは私をここで助けることができます!

Matlabコードは次のとおりです。

b = atan(n(1) / n(2));
rotb = [cos(b) -sin(b) 0; sin(b) cos(b) 0; 0 0 1];
n2 = n * rotb;
a = atan(n(1) / n(3));
rota = [cos(a) 0 sin(a); 0 1 0; -sin(a) 0 cos(a)];
n3 = n2 * rotaows:

n2 のy成分がゼロになると期待しています。ただし、ベクトルでは既に失敗しています(-0.6367、0.7697、0.0467)。

役に立ちましたか?

解決

平面がある場合、法線ベクトルと原点があります。 「回転」はしません。まったく。あなたは答えからほんの数ベクトルの操作です。

  • 飛行機の法線ベクトルを新しいz軸と呼びましょう。
  • 古いx軸と新しいz軸(プレーンの法線)を交差させることで、新しいy軸を生成できます。
  • 新しいzと新しいyを交差させて、新しいx軸を生成します。
  • すべての新しい軸ベクトルを単位ベクトル(長さ1)にします。
  • すべてのポイントについて、新しい原点からポイントまでのベクトルを作成します(ポイントのベクトル減算-plane_origin)。新しいxと新しいyの単位ベクトルをドットするだけで、プロットできるペア(x、y)が得られます!

既にクロス積関数とドット積関数がある場合、これはほんの数行のコードです。私が書いた3Dビデオゲームのほとんどがこのように働いたので、私はそれが働くことを知っています。

トリック:

  • ベクトルが指している方向に注意してください。間違った方向を指している場合、結果のベクトルを無効にするか、外積の順序を変更します。
  • 飛行機の法線が元のx軸とまったく同じ場合、問題が発生します。

他のヒント

方法:

法線ベクトルをXY平面のベクトルとZベクトルに分解します。次に、Z軸の周りに回転を適用して、XYベクトルを軸の1つと揃えます。次に、法線とZ軸の内積を求め、X、Yのいずれかと並んで回転します。

アイデアは、法線ベクトルをZに合わせることです。これにより、プレーンがXYプレーンになります。

他の興味深い応答がありましたが、これは答えを待っている間に私たちが見つけた解決策です:

function roti = magic_cosini(n)
    b = acos(n(2) / sqrt(n(1)*n(1) + n(2)*n(2)));
    bwinkel = b * 360 / 2 / pi;
    if (n(1) >= 0)
        rotb = [cos(-b) -sin(-b) 0; sin(-b) cos(-b) 0; 0 0 1];
    else
        rotb = [cos(-b) sin(-b) 0; -sin(-b) cos(-b) 0; 0 0 1];
    end
    n2 = n * rotb;
    a = acos(n2(3) / sqrt(n2(2)*n2(2) + n2(3)*n2(3)));
    awinkel = a * 360 / 2 / pi;
    rota = [1 0 0; 0 cos(-a) -sin(-a); 0 sin(-a) cos(-a)];
    roti = rotb * rota;

(うまくいけば正しい二重回転行列を返しています)

ここで以前に修正した欠陥は、espでした。 X成分の符号を処理します。これは余弦計算ではカバーされませんでした。これにより、間違った方向に1度回転しました(180°-角度で回転)。

Nosrednaのソリューションを試す時間を見つけられることを願っています!三角法を避けることは常に良いことです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top