Geometry 重叠和对齐三维三角形时出现问题

Geometry 重叠和对齐三维三角形时出现问题,geometry,Geometry,我正试图叠加两个3D三角形来解决一个分子建模问题。这似乎很简单。我将每个三角形的第一个点转换为原点0,0,0。然后我计算了我必须绕z轴旋转的角度,以便将第二个点放在x轴上。使用Rz(θ)的x,y,z公式,这将是y=0时的角度, y=xsin(θ)+ycos(θ)=0,并重新排列,tan(θ)=-y/x 角度应为arctan(-y/x)。但是,将该角度值插回上述原始方程中不会得到零,除非x=y,且切线为一。看起来像是简单的代数-为什么这不起作用? 谢谢您的帮助。其他评论表明,您很可能对投影和测角术

我正试图叠加两个3D三角形来解决一个分子建模问题。这似乎很简单。我将每个三角形的第一个点转换为原点0,0,0。然后我计算了我必须绕z轴旋转的角度,以便将第二个点放在x轴上。使用Rz(θ)的x,y,z公式,这将是
y=0时的角度,
y=xsin(θ)+ycos(θ)=0
,并重新排列,
tan(θ)=-y/x
角度应为
arctan(-y/x)
。但是,将该角度值插回上述原始方程中不会得到零,除非
x=y
,且切线为一。看起来像是简单的代数-为什么这不起作用?
谢谢您的帮助。

其他评论表明,您很可能对投影和测角术感到困惑。还有一种更安全的方法,不使用向量数学(线性代数)进行测角

  • 创建变换矩阵
    m0
    表示与第一个三角形对齐的平面
    t0

    所谓对齐,我的意思是三角形的一条边应该位于一个平面基向量中。这很简单,您只需将一个基向量设置为有问题的边,将原点设置为它的一个点,然后利用叉积来获得重新标记向量

    因此,如果我们的三角形有点
    p0,p1,p2
    ,我们的基向量是
    x,y,z
    ,原点
    o
    ,那么:

    x = p1-p0;      x /= |x|;
    y = p2-p0; 
    z = cross(x,y); z /= |z|;
    y = cross(z,x); y /= |y|;
    o = p0
    
    因此,只需将它们输入到变换矩阵(参见答案底部的链接)

  • 创建变换矩阵
    m1
    表示与第二个三角形对齐的平面
    t1

    它与#1

  • 计算最终变换矩阵
    m
    t1
    转换为
    t0

    这很简单:

    m = Inverse(m1)*m0
    
  • 现在,只要将
    m
    矩阵乘以该点,就可以将
    t1
    中的任何点对齐到
    t0
    。不要忘记使用同伦坐标,以便
    点(x,y,z,1)

    这里是小型C++/OpenGL示例:

    //---------------------------------------------------------------------------
    双t0[3][3]=//第一个三角形
    {
    -0.5,-0.5,-1.2,
    +0.5,-0.5,-0.8,
    0.0,+0.5,-1.0,
    };
    双t1[3][3]=//第二个三角形
    {
    +0.5,-0.6,-2.1,
    +1.5,-0.5,-2.3,
    +1.2,+0.3,-2.2,
    };
    双arot=0.0;//动画角度
    //---------------------------------------------------------------------------
    void gl_draw()//主渲染代码
    {
    int i;
    双m0[16],m1[16],m[16],x[3],y[3],z[3],t2[3][3];
    glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
    glDisable(GLU消隐面);
    glEnable(GLU深度试验);
    glMatrixMode(GLU模型视图);
    glLoadIdentity();
    GLP(0.0,0.0,-10.0);
    glRotatef(arot,0.0,1.0,0.0);
    //渲染原始三角形
    glBegin(GL_三角形);
    
    glColor3f(1.0,0.0,0.0);for(i=0;i,正如其他评论所暗示的那样,你很可能会被投影和测角术弄糊涂。使用向量数学(线性代数)没有测角术也有更安全的方法

  • 创建变换矩阵
    m0
    表示与第一个三角形对齐的平面
    t0

    所谓对齐,我的意思是三角形的一条边应该位于一个平面基向量中。这很简单,你只需将一条基向量设置为有问题的边,原点作为它的一个点,然后利用叉积得到重新标记向量

    因此,如果我们的三角形有点
    p0,p1,p2
    ,我们的基向量是
    x,y,z
    ,原点
    o
    ,那么:

    x = p1-p0;      x /= |x|;
    y = p2-p0; 
    z = cross(x,y); z /= |z|;
    y = cross(z,x); y /= |y|;
    o = p0
    
    因此,只需将它们输入到变换矩阵(参见答案底部的链接)

  • 创建变换矩阵
    m1
    表示与第二个三角形对齐的平面
    t1

    它与#1

  • 计算最终变换矩阵
    m
    t1
    转换为
    t0

    这很简单:

    m = Inverse(m1)*m0
    
  • 现在,只要将
    m
    矩阵乘以该点,即可将
    t1
    中的任何点对齐到
    t0
    。不要忘记使用同伦坐标,因此
    点(x,y,z,1)

    这里是小型C++/OpenGL示例:

    //---------------------------------------------------------------------------
    双t0[3][3]=//第一个三角形
    {
    -0.5,-0.5,-1.2,
    +0.5,-0.5,-0.8,
    0.0,+0.5,-1.0,
    };
    双t1[3][3]=//第二个三角形
    {
    +0.5,-0.6,-2.1,
    +1.5,-0.5,-2.3,
    +1.2,+0.3,-2.2,
    };
    双arot=0.0;//动画角度
    //---------------------------------------------------------------------------
    void gl_draw()//主渲染代码
    {
    int i;
    双m0[16],m1[16],m[16],x[3],y[3],z[3],t2[3][3];
    glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
    glDisable(GLU消隐面);
    glEnable(GLU深度试验);
    glMatrixMode(GLU模型视图);
    glLoadIdentity();
    GLP(0.0,0.0,-10.0);
    glRotatef(arot,0.0,1.0,0.0);
    //渲染原始三角形
    glBegin(GL_三角形);
    
    glColor3f(1.0,0.0,0.0);for(i=0;i当你围绕一个轴旋转一个3D点(比如z轴)时,它沿着一个圆周。这个圆周可能会碰到一个轴(比如x轴),但通常不会。我想你是在做投影而不是交点
    tan(x)
    具有90度的奇数倍的渐近线,因此它不能很好地处理这些边缘情况。如果您的语言支持,您应该使用
    atan2(y,x)
    。这仅通过使用
    +
    -
    *
    交叉和点积(偶数)的基本向量/矩阵数学就可以做到不需要测角仪,因为它会降低结果的准确性。无论如何,我投票结束这个问题,因为它是离题的