2017-03-07 39 views
1

我正在用三维几何形状(不是最佳选择,我知道...)在php中工作。 我有K共面三维点,也与x,y,z值。他们一起形成一个多边形。我需要对这个多边形进行三角测量。我已经有一个适用于2D多边形的工作delaunay traingulation函数。 所以我想旋转给定的点,以便它们躺在平行于x,y平面的平面上。之后,我可以使用x,y值对它进行三角化。下面的伪代码应该描述我想如何达到这个目标。将K共面指向一个平行于x,y平面的平面

我建立了以下代码,并在此参考(我正在接受来自OP的答案):https://math.stackexchange.com/questions/180418/calculate-rotation-matrix-to-align-vector-a-to-vector-b-in-3d,但它不能按我的预期工作。为了知道它是否工作,每个映射点应该具有相同的'z'值。 这里是问题,我如何得到正确的旋转矩阵?还是我犯了一个概念错误?

function matrixRotationMapping(Point $p, Point $q, Point $r) 
     { 
      $normalPolygon =calculatePlaneNormal($p, $q, $r); 
      $v = crossProduct($normalPolygon, new Point(0, 0, 1)); 
      $c = dotProduct($normalPolygon, new Point(0, 0, 1)); 
      $matrix = buildRotationMatrix($v, $c);  
      return $matrix; 
     }  

function buildRotationMatrix($v, $c) 
     { 
      $R2 = new Matrix(array(array(1, -$v->z, $v->y), array($v->z, 1, -$v->x), array(-$v->y, $v->x, 1))); 
      $costant = 1/(1+$c); 
      $R3 = multiplyMatrices($R2, $R2); 
      $R3 = multiplyMatricesWithFactor($R3, $costant); 
      $finalMatrix = sumMatrices($R2, $R3); 
      return $finalMatrix; 
     } 

function calc2DMapping($points) 
     { 
      $rotationMatrix = matrixRotationMapping($points[0], $points[1], $points[2]); 
      foreach($points as $point) 
       { 
        $mappedPoint = $rotationMatrix->multiplyWithPoint($point);    
        $mappedPoints[] = new MappedPoint($mappedPoint); 
       }  
     } 

我发现这个问题的另一个实用的说明,但我没能实现它:Mapping coordinates from plane given by normal vector to XY plane

预先感谢您的关注。

回答

0

您首先需要基础向量X,Y,Z。因此,首先从数据集中取A的中点和两个远点B,C(不在一行)。该X,Y应当处于在平面和Z应该是正常的它,因此:

X = B-A  // any non zero vector inside plane 
X = X/|X| // unit in size 

Y = C-A  // any non zero vector inside plane 
(X.Y) != 0 // but not parallel to X !!! 
Y = Y/|Y| // unit in size 

计算正常您点位于在平面和正确的Y轴。

Z = X x Y // cross product gives you perpendicular vector 
Y = Z x X // now all vectors are perpendicular and unit 

所以养活这3个向量您transform matrix并设置原点A的旋转部分。但是当你需要从数据集飞机去当地的协调,你需要逆矩阵(或使用基于换位伪逆)现在

反正与基本向量可以参数化映射你的飞机是这样的:

P(u,v) = A + u*X + v*Y 

其中u,v = <-inf,+inf>是在X,Y方向的表面距离形式A.有时候这可以得到方便。如果你需要计算从Pu,v然后利用点积:

u = ((P-A).X) = dot(P-A,X) 
v = ((P-A).Y) = dot(P-A,Y) 

它也可以用来转换成2D而是采用矩阵...

+0

您好,我很抱歉,但我不完全取得您的解决方案。我已经知道所有的点都在同一个平面上,我可以很容易地找出平面的法线和方程。我想要做的是将所有点旋转/映射到平行于标准X,Y平面的平面,也是由(0,0,1)Vector定义的平面。 – Swisx

+0

@Swisx最后一个等式给你'u,v'你可以用它作为旋转点'P'...'z = 0'的x,y坐标什么是不明确的? (你不懂矢量数学?或者什么具体?) – Spektre

+0

Thaks第二个解释,是在最后一部分,我不太确定你的意思是什么。但知道我懂了,我可以实现它。当点位于与x,y平面正交的平面上时,即使在边缘情况下,它看起来仍在工作。非常感谢你。 – Swisx