【问题标题】:NON orthogonal projection : projecting a point onto a line at given direction (2d)非正交投影:在给定方向(2d)将一个点投影到一条线上
【发布时间】:2013-12-10 16:51:45
【问题描述】:

我需要一个解决方案,将 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):

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

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

【问题讨论】:

    标签: geometry 2d projection


    【解决方案1】:

    我可以想出两种方法。

    我个人会使用仿射变换来做到这一点(但似乎你没有这个概念,因为你使用的是向量而不是点)。仿射变换的过程很简单。将点旋转到一个基轴,将点的坐标读取为零另一个值并逆变换回来。这种策略的原因是几乎所有的转换过程都使用仿射转换方案简化为非常简单的人类可理解的操作。因此,一旦您手头有工具和数据结构,就没有真正的工作可做。

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

    这表示为一个方程系统的样子(它故意以这种方式向您展示此时它不是代码而是数学):

    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 完成的计算应该可以工作。但我永远不会使用这个解决方案,因为它无法理解(尽管它是高中数学,或者至少它是我所在的地方)。但是如上所述使用空间变换。

    【讨论】:

    • 嗨!首先,很抱歉发晚了,这几天我很忙。我终于设法以一种特殊的方式解决了它(类似于你的第二个建议),但是你是对的:仿射变换是正确的(或者至少是标准的方式) )要解决这个问题,我只需要更深入地研究它......无论如何,解决方案非常简单:将点(P1)投影到与方向正交的向量上。现在我们有了一个新点(我们称之为 P2)所以我们只需要找到两条线之间的交点(line1 和 P1,P2 之间的一条线),结果就是投影(Pic2 上的 Pr)
    猜你喜欢
    • 2016-07-14
    • 2010-09-12
    • 1970-01-01
    • 2014-08-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多