代码之家  ›  专栏  ›  技术社区  ›  Nathan

为圆定义一个函数,将直线段的末端加上大写。

  •  0
  • Nathan  · 技术社区  · 15 年前

    我需要一个函数,它返回一个三维圆上的点。

    圆应该“覆盖”由A点和B点定义的线段及其半径。每个盖子垂直于线段。集中在其中一个端点。

    Here is a shitty diagram

    2 回复  |  直到 15 年前
        1
  •  1
  •   David Norman    15 年前

    设n为a到b方向的单位矢量,即n=(b-a)/长度(a-b)。第一步是找到另外两个向量x和y,使n,x,y形成一个基。这意味着您需要两个以上的向量,以便所有对的n、x、y相互垂直,并且它们都是单位向量。另一种方法是创建一个新的坐标系,该坐标系的X轴与直线段对齐。您需要找到指向y轴和z轴方向的向量。

    注意,对于x和y有无限多的选择,你只需要找到两个有效的。

    一种方法是首先找到向量n,w,v,其中n来自上面,w和v是(1,0,0),(0,1,0)和(0,0,1)中的两个。选取W和V对应于N的最小坐标的两个向量。因此,如果N=.31,.95,0,那么您可以选取(1,0,0)和(0,0,1)代表W和V。(数学怪人注意:这种选取W和V的方式确保N,W,V跨距R^3)。然后你应用 Gram-Schmidt process 到n,w,v得到矢量n,x,y,如上所述。注意,你需要向量n作为第一个向量,这样它就不会被过程所改变。

    现在有两个向量,它们垂直于线段,相互垂直。这意味着围绕a的圆上的点是x*cos t+y*sin t+a,其中0<=t<2*pi。这与通常对二维圆的描述完全相同;它只是写在上面描述的新坐标系中。

        2
  •  1
  •   dmuir    15 年前

    正如大卫诺曼所指出的,关键是找到两个与n正交的正交单位向量x,y。然而,我认为计算这些向量的一个更简单的方法是找到户主反射q,它将n映射为(1,0,0)的倍数,然后将q和y下(0,1,0)的图像取为x,作为(0,0,1)在q下。虽然听起来很复杂,但可以归结为:

    S=(N[0]>0.0)?1.0至1.0

    t=n[0]+s;f=-1.0/(s*t);

    x[0]=f*n[1]*t;x[1]=1+f*n[1]*n[1];x[2]=f*n[1]*n[2];

    y[0]=f*n[2]*t;y[1]=f*n[1]*n[2];y[2]=1+f*n[2]*n[2];