我正在用三维几何形状(不是最佳选择,我知道...)在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
预先感谢您的关注。
您好,我很抱歉,但我不完全取得您的解决方案。我已经知道所有的点都在同一个平面上,我可以很容易地找出平面的法线和方程。我想要做的是将所有点旋转/映射到平行于标准X,Y平面的平面,也是由(0,0,1)Vector定义的平面。 – Swisx
@Swisx最后一个等式给你'u,v'你可以用它作为旋转点'P'...'z = 0'的x,y坐标什么是不明确的? (你不懂矢量数学?或者什么具体?) – Spektre
Thaks第二个解释,是在最后一部分,我不太确定你的意思是什么。但知道我懂了,我可以实现它。当点位于与x,y平面正交的平面上时,即使在边缘情况下,它看起来仍在工作。非常感谢你。 – Swisx