非正交投影:在给定方向上将点投射到线上(2d)

时间:2013-12-10 16:51:46

标签: geometry 2d projection

我需要一个解决方案,将某个2d点投射到某个方向的2d线上。这就是我到目前为止所做的:这是我如何进行正交投影:

CVector2d project(Line line , CVector2d point)
{
    CVector2d A = line.end - line.start;
    CVector2d B = point - line start;

    float dot = A.dotProduct(B);
    float mag = A.getMagnitude();

    float md = dot/mag;

    return CVector2d (line.start + A * md);
} 

结果:

(将P投影到线上,结果为Pr):

enter image description here

但是我需要将点投影到给定DIRECTION的线上,该线应该返回这样的结果(项目点P1在特定方向的线上计算Pr):

enter image description here

我应该如何考虑方向矢量来计算Pr?

1 个答案:

答案 0 :(得分:0)

我可以想出两种方法。

就我个人而言,我会使用仿射变换(但似乎你没有这个概念,因为你使用的是矢量而不是点)。具有仿射变换的过程很容易。将点旋转到其中一个基本轴,读取点的坐标为零,然后反向变换。这种策略的原因在于几乎所有的转换过程都通过仿射变换方案简化为非常简单的人类可理解的操作。因此,一旦掌握了工具和数据结构,就没有真正的工作要做。

然而,由于你没有看到这一点,我假设你想要听到一个向量运算(因为你要么更喜欢矩阵运算,要么在它的建议时逃跑,坚持它同样的事情)。所以你有以下情况:

A example of how the vectors result in your solution

这表示为方程式系统看起来像(它故意用这种方式向你展示它不是代码而是数学):

line.start.x + x*(line.end.x - line.start.x)+ y*direction.x = point.x
line.start.y + x*(line.end.y - line.start.y)+ y*direction.y = point.y

现在可以解决x(和y)

x = (direction.y * line.start.x - direction.x * line.start.y -
    direction.y * point.x + direction.x * point.y) /
    (direction.y * line.end.x - direction.x * line.end.y - 
     direction.y * line.start.x + direction.x * line.start.y);

// the solution for y can be omitted you dont need it

y = -(line.end.y * line.start.x - line.end.x * line.start.y - 
      line.end.y * point.x + line.start.y * point.x + line.end.x * point.y - 
      line.start.x point.y)/
     (-direction.y * line.end.x + direction.x * line.end.y + 
      direction.y *  line.start.x - direction.x * line.start.y)

使用mathematica完成计算如果我没有复制任何错误它应该工作。但我永远不会使用这个解决方案,因为它不可理解(虽然它是高中数学,或者至少它是我所在的地方)。但是如上所述使用空间转换。