在C / C ++中使用GSL将多边形投影到平面上

时间:2010-08-01 17:53:19

标签: c++ math linear-algebra gsl

将一个多边形投影到一个平面上的一般问题得到了广泛的解决,但我想知道是否有人能为我的具体案例提出一些建议。

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

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

基础本身无关紧要,只要它是正交的。所以我真的需要在GNU科学库的框架内做两件事:

(1)找到与单位向量u正交的均匀平面的两个标准正交基矢量。

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

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

3 个答案:

答案 0 :(得分:2)

我没有使用过GSL,但你只需要使用点积,交叉积和规范化来得到结果。

(1)选择不是 u 的倍数的任何向量 r 。设 v = r u 的规范化交叉积。让 w = u v 的交叉积。您的标准正交基矢量是 v w

(2)要将顶点 a 投影到此平面,它是( a v )* v +( a w )* w 。 ( v 坐标为 a v w 坐标为 a 点的瓦特

为了帮助考虑其工作原理,请选择 u =< 1,0,0>并且 r =< 3,0,5>开始,并可视化三维矢量。

答案 1 :(得分:1)

问题是缺少一条信息,即一个基础向量的方向。问题是基础向量必须是正交的(即单位长度和彼此垂直),当然垂直于u(因为它们位于垂直于u的平面内),但仍然可以使它们自由地绕着你旋转到任何角度

答案 2 :(得分: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];
}

这里假设你的长度为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是一个点,则P.v和P.u是投影到与u正交的平面上的P的坐标,通过原点。