0

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

圆应该“盖住”由点 A 和 B 及其半径定义的线段。每个帽都垂直于线段。并以其中一个端点为中心。

这是一张烂图

4

2 回答 2

1

令N为从A到B方向的单位向量,即N = (BA) / length(AB)。第一步是找到另外两个向量 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 选择 (1,0,0) 和 (0,0,1)和 V。(数学极客笔记:这种选择 W 和 V 的方式可确保 {N,W,V} 跨越 R^3)。然后将Gram-Schmidt 过程应用于 {N, W, V} 以得到向量 {N, X, Y} 如上所述。请注意,您需要将向量 N 作为第一个向量,以便它不会被进程更改。

所以现在你有两个垂直于线段并相互垂直的向量。这意味着 A 周围的圆上的点是 X * cos t + Y * sin t + A,其中 0 <= t < 2 * pi。这与通常对二维圆的描述完全一样;它只是写在上面描述的新坐标系中。

于 2010-09-28T03:21:19.547 回答
1

正如 David Norman 指出的那样,关键是要找到与 N 正交的两个正交单位向量 X,Y。但是我认为计算这些的更简单方法是找到将 N 映射到 (1,0, 0) 然后将 (0,1,0) 在 Q 下的图像作为 X,将 Y 作为 (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];

于 2010-09-28T13:48:08.800 回答