我需要一个在三维空间中返回圆上的点的函数。
圆应该“封顶”由点A和B及其半径定义的线段。每个封口都垂直于线段。并以其中一个端点为中心。
Here is a shitty diagram
发布于 2010-09-28 11:21:20
设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),那么您可以为W和V选择(1,0,0)和(0,0,1) (数学极客注意:这种选择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。这就像通常对二维中的圆的描述;它只是写在上面描述的新坐标系中。
发布于 2010-09-28 21:48:09
正如David Norman所指出的,关键是找到两个与N正交的正交单位向量X,Y。然而,我认为计算这些向量的更简单的方法是通过找到将N映射到(1,0,0)的倍数的户主反射Q,然后将Q和Y下的(0,1,0)的图像作为X。虽然这听起来可能很复杂,但归结为:
S= (N > 0.0)?1.0:-1.0
T=N+ s;f= -1.0/(s*t);
X= f*N1*t;X1 =1+ f*N1*N1;X2 = f*N1*N2;
Y= f*N2*t;Y1 = f*N1*N2;Y2 =1+ f*N2*N2;
https://stackoverflow.com/questions/3808017
复制相似问题