Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将三维坐标变换为二维坐标,并使用C#_C#_Graphics_3d_Geometry - Fatal编程技术网

将三维坐标变换为二维坐标,并使用C#

将三维坐标变换为二维坐标,并使用C#,c#,graphics,3d,geometry,C#,Graphics,3d,Geometry,三角形有三个顶点:(x1,y1,z1);(x2,y2,z2);(x3,y3,z3)。 基本上,我想将这3个顶点变换到一个XY平面上,使顶点看起来像(0,0);(c,d);(e,f) 一旦得到XY平面上的点,我会使用2D采样算法生成一些采样点。然后,我对这些采样点应用逆变换,称之为:(l,m,0),并将其转换回3D(类似于(q,w,t)) 如果有人能在以下功能方面帮助我,我将非常高兴: Transform(),它将三维顶点作为输入,并将其转换为二维(XY平面)点 InverseTransform(

三角形有三个顶点:(x1,y1,z1);(x2,y2,z2);(x3,y3,z3)。 基本上,我想将这3个顶点变换到一个XY平面上,使顶点看起来像(0,0);(c,d);(e,f)

一旦得到XY平面上的点,我会使用2D采样算法生成一些采样点。然后,我对这些采样点应用逆变换,称之为:(l,m,0),并将其转换回3D(类似于(q,w,t))

如果有人能在以下功能方面帮助我,我将非常高兴: Transform(),它将三维顶点作为输入,并将其转换为二维(XY平面)点

InverseTransform(),它将二维点作为输入,并将其转换为三维(XYZ平面)点


提前谢谢

编辑:完全重写

您可以在
(0,0,0)中找到变换三维点的仿射矩阵;(c,0,0);(e,f,0)
form(注意第二点的y=0)

首先,将所有点移动
(-x1,-y1,-z1)
,这样我们就有了坐标原点中的第一个点。其他两个顶点的新坐标为
Bx、By、Bz、Cx、Cy、Cz
,其中
Bx=x2-x1
,依此类推(向量BC

然后进行旋转,必须:

1) 将B点转换为
OX
轴上的点,其中
Lb
是向量B的长度

 Bx,By,Bz => Lb,0,0 
2) 将三角形的法线转换为与OZ轴共线的向量

 N = B x C  //cross product
 Ln = Length(N)
 Nx,Ny,Nz => 0,0,Ln
3) 有一段时间我还不清楚:)
将源正交基的第三个向量变换为与OY轴共线的向量

P = B x N  
Lp = Length(P)
Px,Py,Pz => 0,Lp,0
汇总:

             [Bx  Nx  Px]    [Lb  0  0]
 RotMatrix * [By  Ny  Py] =  [0   0  Lp]
             [Bz  Nz  Pz]    [0  Ln  0]
或更短

RotMatrix * BNP = L
所以我们可以找到

 RotMatrix  = L * Inverse(BNP)
最后

AffineMatrix = ShiftMatrix * RotMatrix

但为什么需要这样的转换呢

也许在初始位置对三角形点进行采样就足够了,如()所示:


你试过什么?我的意思是,对我来说,你想忽略z轴,只需要取xy,然后返回它作为一个点。。所以是什么阻止了你写东西抱歉,只是编辑了它!它类似于,其中一个顶点应转换为原点,其他两个3D点将类似:(a,b)和(c,d)您应该阅读所有关于线性代数的内容您需要
1:1
映射,而不是
N:1
投影,因为一旦您将3D点投影到平面上,您就无法返回原始3D坐标。但是,映射很可能无法使用二维插值或您希望执行的任何操作,因为从三维到二维和从二维到二维的映射通常是不连续的,并且会破坏在其他维度中应用的任何几何特征。你最好的选择是改变你想要应用到3D的2D内容。在不知道它是什么的情况下,我们无法决定是否可能(即使你声称不可能,但这并不意味着它真的不可能)。如果你只想在变换后得到三维平面点,那么很容易使用基向量和平面原点在二维和三维之间进行转换。它比听起来要简单,而且采样不是我的主要工作…我有一些不同的采样算法,它们只在2D上工作,而在3D上不工作。我们不能找到将3D点变换为(0,0)的仿射矩阵吗;(a,b)和(c,d)?我给了你们3D的例子sampling@MB0你说得对!你能写出将3D顶点转化为(0,0)的算法吗;(c,0)和(e,f)??我认为它[[x2',y2',z2',[x3',y3'z3']]*Mrot=[[Length12,0,0][someX,someY,0]]对吗??bcoz,M=M=Mshift*Mrot。它(未知角度方程组的求解)通常是正确的,但我们已经知道一些角度。这就是为什么我删除了这种方法(点对)
for u = 0 to N  //sampling level
  for v = 0 to N - u
     w = N - u - v
     p = GetPoint(Vertices, u/N, v/N, w/N)