2016-12-02 21 views
0

Vector3点の集合が与えられたら、それらが任意の平面上で同一平面上にあるかどうかを調べる必要があります。それらが同一平面上にあると仮定すると、それらをすべての点の間のスケールを保持しながらXY平面にマップ/投影する必要があります。Three.js - 点が同一平面上にあるかどうかを決定し、同一平面上の点をXY平面にマッピングする

私は検証のために...このための数学があまりにもハードですがthree.jsを使用してそれを行うには、単純な/効果的な方法を探しています

+0

点集合が同平面であるかどうかをテストする方法の1つは、最初の3点をとり、 'Plane.setFromCoPlanarPoints(p1、p2、p3)'を使って平面を作ることです。それ以降の点については 'Plane.distanceToPoint(p)'を使います。これは私が不思議な最初の部分を行う効率的な方法ですか? – jugglingcats

答えて

1

1)機能とは思わない4点のこと

function tripleProduct(a,b,c) { 
    return a.clone().dot(
    (new THREE.Vector3()).cross(b,c) 
); 
} 

function _isCoPlanar(a,b,c,d) { 
    var ab = b.clone().sub(a); 
    var ac = c.clone().sub(a); 
    var ad = d.clone().sub(a); 
    return tripleProduct(ab,ac,ad) === 0; 
} 

You need to go through the array、最初の3つのポイントと同一平面上に第四の嘘以来、すべてのポイントということを確認してください:同一平面上に嘘はvery simpleです。

2)平面上に投影するには、projectOnPlane関数を使用できます。

+0

ありがとうございます。私の場合はチェックする点数が任意であるため、ソリューションを直接使用することはできませんが、私はそれを適応させることができます。最初の飛行機を見つけ、その後のポイントで 'distanceTo'を使うというコメントで私が提案したアプローチよりも速いでしょうか? – jugglingcats

+0

@jugglingcats私はこれがあなたが提案した方法よりも正確だと思います。 'jsfiddle'へのリンクを見てください - そこには多数のポイントの例があります。 –

+0

'projectOnPlane'に関しては、この場合、望ましい結果が得られません。例えば、点[(0,0,0)、(1,0,0)、(1,0,1)、(0,0,1)] 'を考える。 XZ平面の正方形。これらをXY平面上に投影すると、線上に点を与えます: '[(0,0,0)、(1,0,0)、(1,0,0)、(0,0,0)]' 。意図は、形状を維持しながら、正方形/共平面の点をXY平面(またはXYに平行な任意の平面)に変換することです。 – jugglingcats

関連する問題