1

一般问题是将多边形投影到平面上已得到广泛解决,但我想知道是否有人可以为我的特殊情况提出一些建议。

我在 3 空间中有一个平面多边形 P,我想通过与单位向量 u 正交的原点将它投影到平面上。P 的顶点和 u 的坐标是我拥有的唯一数据(所有数据都是 R^3 的标准基础)。

但是,我不只是想要投影坐标。我实际上想找到与 u 正交的平面的正交基,然后在这个新基中找到投影顶点的坐标。

基础本身并不重要,只要它是正交的。所以我真的需要在 GNU 科学图书馆的框架内做两件事:

(1) 求与单位向量u正交的齐次平面的两个正交基向量。

(2) 求P 的顶点在平面上的投影在此基础上的坐标。

关于如何使用 gsl 执行此操作的任何想法?

4

3 回答 3

2

我没用过GSL,但是你只需要使用点积、叉积和归一化就可以得到结果。

(1) 选择任何不是u倍数的向量r。令v = ru的归一化叉积。令w = uv的叉积。您的标准正交基向量是vw

(2) 将一个顶点a投影到这个平面上,它是 ( a dot v ) * v + ( a dot w ) * w。(v坐标是一个vw坐标是一个w

为了帮助思考其工作原理,选择u = <1,0,0> 和r = <3,0,5> 开始,并可视化 3-d 向量。

于 2010-08-01T18:22:39.267 回答
1

问题是缺少一条信息,即基向量之一的方向。问题是基向量必须是正交的(即单位长度并相互垂直),当然也垂直于 u(因为它们位于垂直于 u 的平面中),但这仍然可以让它们自由地围绕 u 旋转到任何角度.

于 2010-08-01T18:43:31.143 回答
1

计算向量 v 和 w 以使 u,v,w 是标准正交基:

void    make_basis3( const double* u, double* v, double* w)
{  double   h[3];
double  d;
double  s = ( u[0] > 0.0) ? 1.0 : -1.0;
double  f = s/(s+u[0]);
h[0] = u[0]+s;  h[1] = u[1]; h[2] = u[2];
d = f*h[1]; v[0] = -d*h[0]; v[1] = 1.0-d*h[1]; v[2] = -d*h[2];
d = f*h[2]; w[0] = -d*h[0]; w[1] = -d*h[1]; w[2] = 1.0-d*h[2];
}

这里假设 u 的长度为 1。

这里发生的是前几行计算一个向量 h 使得基于 h 的户主矩阵(即 Q=I - 2*h*h'/h'*h 其中 ' 是转置)将 u 映射到 (+- 1,0,0) 和最后两行将此矩阵应用于 (0,1,0) 以获取 v,并将此矩阵应用于 (0,0,1) 以获取 w。由于 Q 是正交且对称的,因此 u,v,w 是正交基。

我认为这种方法比使用叉积更可取,因为:它更短,更高效,更不易受到舍入误差的影响,并且可以推广到更高的维度。

如果 P 是一个点,则 Pv 和 Pu 是 P 通过原点投影到与 u 正交的平面上的坐标。

于 2010-08-03T11:04:52.537 回答