因此,我有此算法来计算法线向量给定的3D形状的横截面。
但是,我当前的问题是,该横截面是一组3D点(都位于给定平面上),并且要显示该剖面,我需要将此坐标映射到XY平面。
如果平面法线是(0,0,c)之类的东西,这将是完美的-我只是复制x和y坐标而放弃z。
这是我的问题:由于我不知道如何转换其他平原,有人可以给我任何有关我现在应该做什么的提示吗?
您的窗格由法线矢量定义
n=(xn,yn,zn)
为了进行协调转换,我们需要2个基本向量和一个零点的窗格
基本向量
我们选择了那些“自然”适合x / y窗格的样式(有关边缘情况,请参阅下文):
b1=(1,0,zb1) b2=(0,1,zb2)
我们想要
b1 x b2 = n*c (c const标量)
b1 x b2 = n*c
确保这两个是真正的基础
现在解决这个问题:
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))
边缘情况是,当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
与d const标量。自然的拟合将是窗格的点,它是由原始零点在窗格上的法线投影定义的:
P0=(x0,y0,z0)
与
(x0, y0, z0) = c * (xn,yn,zn)
解决这个问题
给
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’是您想要的新坐标。