Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Geometry 非正交投影:以给定方向(2d)将点投影到直线上_Geometry_2d_Projection - Fatal编程技术网

Geometry 非正交投影:以给定方向(2d)将点投影到直线上

Geometry 非正交投影:以给定方向(2d)将点投影到直线上,geometry,2d,projection,Geometry,2d,Projection,我需要一个解决方案,将一个二维点投影到某个方向的二维线上。以下是我到目前为止得到的结果:这是我如何进行正交投影的: 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

我需要一个解决方案,将一个二维点投影到某个方向的二维线上。以下是我到目前为止得到的结果:这是我如何进行正交投影的:

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?

我可以想出两种方法

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

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

这表示为一个方程系统,看起来像(它故意这样告诉你,在这一点上,它不是代码,而是数学):

现在可以解决x(和y)的问题


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

嗨!首先,为迟发的帖子感到抱歉,我最近很忙。我终于设法用一种特殊的方法解决了它(类似于你的第二个建议),但是你是对的:仿射变换是解决这个问题的正确方法(或者至少是标准方法),我只需要更深入地研究它。。。无论如何,解决方法很简单:将点(P1)投影到与方向正交的向量上。现在我们得到了一个新的点(我们称之为P2),所以我们只需要找到两条线之间的交点(线1和P1,P2之间的一条线),结果就是投影(图2上的Pr)
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 = (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)