将坐标从法线向量给定的平面映射到XY平面

sto*_*rin 4 algorithm 3d geometry 2d plane

因此,我有这个算法来计算3D形状的横截面与平面给定的法向量.

然而,我目前的问题是,横截面是3D点的集合(全部位于该给定平面上)并且为了显示它我需要将该坐标映射到XY平面.

如果平面法线类似于(0,0,c),这种方法很有效 - 我只是复制x和y坐标,丢弃z.

这是我的问题:既然我不知道如何转换任何其他平原,任何人都可以给我任何关于我现在应该做什么的提示?

Eug*_*eck 7

您的窗格由法线向量定义

n=(xn,yn,zn)
Run Code Online (Sandbox Code Playgroud)

对于协调变换,我们需要2个基本向量和窗格的零点

基础载体

我们选择那些"自然"拟合到x/y窗格(稍后见边缘情况):

b1=(1,0,zb1)
b2=(0,1,zb2)
Run Code Online (Sandbox Code Playgroud)

我们想要

b1 x b2 = n*c (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)
Run Code Online (Sandbox Code Playgroud)

并规范化它

bv1=(1,0,yn/zn)*sqrt(1+(yn/zn*yn/zn))
bv2=(0,1,yn/zn)*sqrt(1+(xn/zn*xn/zn))
Run Code Online (Sandbox Code Playgroud)

边缘情况是,当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)
Run Code Online (Sandbox Code Playgroud)

如果没有,我假设你有一个锚点(xa,ya,za),你的窗格也有

x*xn+y*yn+z*zn=d
Run Code Online (Sandbox Code Playgroud)

用d const标量.自然拟合将是窗格的点,通过将原始零点正常投影到窗格上来定义:

P0=(x0,y0,z0)
Run Code Online (Sandbox Code Playgroud)

(x0, y0, z0) = c * (xn,yn,zn)
Run Code Online (Sandbox Code Playgroud)

解决这个问题

x*xn+y*yn+z*zn=d
Run Code Online (Sandbox Code Playgroud)

c*xn*xn+c*yn*yn+c*zn*zn=d
Run Code Online (Sandbox Code Playgroud)

c=d/(xn*xn+yn*yn+zn*zn)
Run Code Online (Sandbox Code Playgroud)

从而

P0=(x0,y0,z0)=c*(xn,yn,zn)
Run Code Online (Sandbox Code Playgroud)

找到了.

最后的转变

通过将窗格的每个点(即您想要显示的那些点)表示为来实现

P0+x'*bv1+y'*bv2
Run Code Online (Sandbox Code Playgroud)

x'和y'是新的坐标.因为我们知道P0,bv1和bv2这是非常微不足道的.如果我们不是边缘情况,我们在bv1.y和bv2.x中有零,进一步减少了问题.

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