2012-01-08 109 views
3

所以,我有这个算法来计算3D平面与法向矢量给出的平面的截面。从法向矢量给出的平面到XY平面的坐标映射

但是,我目前的问题是,横截面是由三维点组成(全部位于给定平面上)并显示它,我需要将此坐标映射到XY平面。

如果平面法线类似于(0,0,c) - 这就完美了 - 我只是复制x和y坐标而丢弃z。

这里是我的问题:由于我不知道如何转换任何其他平原,任何人都可以给我任何暗示,我现在该怎么办?

+0

我怀疑你想要做的是投影从窗格(你的横截面)到另一个(x,y)或从一个到另一个坐标转换 - 哪一个? – 2012-01-08 19:51:05

+0

目前,我在3D坐标系中设置了三维点(x,y,z)(实际上(x,y,z,1))。我想要的是在XY平面匹配(x,y,z)的二维点(x',y')(例如x',y',1) )在由法向量给出的3D平面中。到目前为止,我认为如果我可以旋转矢量给出的平面,我可以用这种方式来设计点:(x,y,z,1) - >(x,y,1) – stollgrin 2012-01-08 19:59:15

+0

@EugenRieck Hey Eugen,你会怎么说是“从窗格(你的横截面)到另一个(x,y)的投影或者从一个到另一个的坐标变换” – user1084113 2013-03-04 16:36:50

回答

7

你窗格可通过正常的矢量

n=(xn,yn,zn) 

对于坐标变换定义,我们需要2个基向量和零点窗格

基向量

我们选择那些“自然地“装配到x/y窗格(稍后参见边缘情况):

b1=(1,0,zb1) 
b2=(0,1,zb2) 

我们想

​​(C const的标量)

,以确保这两个是真正立足

现在解决这个问题:

b1 x b2= (0*zb2-zb1*1,zb1*0-1*zb2,1*1-0*0) = (zb1,zb2,1) 
zb1*c=xn 
zb2*c=yn 
1*c=zn 

c=zn, 
zb2=yn/c=yn/zn 
zb1=xn/c=xn/zn 

b1=(1,0,yn/zn) 
b2=(0,1,xn/zn) 

和规范它

bv1=(1,0,yn/zn)*sqrt(1+(yn/zn*yn/zn)) 
bv2=(0,1,yn/zn)*sqrt(1+(xn/zn*xn/zn)) 

An边缘情况是,当zn = 0时:在这种情况下,法向矢量平行于x/y窗格,并且不存在自然基矢量。在这种情况下,您必须通过美观POV选择基底b1和b2矢量,并通过相同的解决方案流程或只选择bv1和bv2。

零点

你不会说锚点在OQ的窗格,但它需要从平行窗格的无限族区分你的窗格。

如果你的定位点(0,0,0),这是为坐标变换一个完美的锚点和您的面板上有

x*xn+y*yn+z*zn=0, 
(y0,y0,z0)=(0,0,0) 

如果没有,我假设你有(XA的锚点,ya,za)并且您的窗格有

x*xn+y*yn+z*zn=d 

with d const标量。自然地适合将是窗格的点,即由原始零点的正常投影所限定到窗格:

P0=(x0,y0,z0) 

(x0, y0, z0) = c * (xn,yn,zn) 

解决这个反对

x*xn+y*yn+z*zn=d 

给出

c*xn*xn+c*yn*yn+c*zn*zn=d 

c=d/(xn*xn+yn*yn+zn*zn) 

从而

P0=(x0,y0,z0)=c*(xn,yn,zn) 

被发现。

最终转化

由代表你的窗格的每一个点(即你想显示这些点)作为

P0+x'*bv1+y'*bv2 

具有x“和y”是新的坐标来实现的。既然我们知道P0,bv1和bv2,这是相当微不足道的。如果我们不在边缘情况下,我们在bv1.y和bv2.x中有零点,进一步减少了问题。

x'和y'是您想要的新坐标。

+0

非常好的解释!我面临同样的问题,并在计算出的基向量上表示三维点,我使用点积将它们投影到基向量上。 'x'= pt3d.dot(bv1) y'= pt3d.dot(bv2)' 它是正确的吗? – Dexter 2012-02-15 15:34:58

+0

嗨,我想这里有一个小错误: 'b1 =(1,0,yn/zn) b2 =(0,1,xn/zn)' 实际上b1 * n〜= 0,减去。 (1,0,-n/zn) b2 =(0,1,-xn/zn)' – 2017-09-12 21:50:43