给定起点和终点,以及距离,计算一条直线上的某个点。

17

寻找一种最快的方法来计算距离线段端点一定距离处的点:

void calculate_line_point(int x1, int y1, int x2, int y2, int distance, int *px, int *py) 
{
    //calculate a point on the line x1-y1 to x2-y2 that is distance from x2-y2
    *px = ???
    *py = ???
}  

感谢回复,这不是作业,只是我在专业领域之外的一些尝试。

以下是建议使用的函数。它与实际情况相距甚远。如果我在圆形的右上90度部分以每5度计算一个点作为起始点,并将该函数称为具有距离为4的x2、y2圆心,则终点完全错误。它们位于中心下方和右侧,并且长度与中心点一样长。大家有什么建议吗?

void calculate_line_point(int x1, int y1, int x2, int y2, int distance)
{

//calculate a point on the line x1-y1 to x2-y2 that is distance from x2-y2

  double vx = x2 - x1; // x vector
  double vy = y2 - y1; // y vector

  double mag = sqrt(vx*vx + vy*vy); // length

  vx /= mag;
  vy /= mag;

// calculate the new vector, which is x2y2 + vxvy * (mag + distance).

  px = (int) ( (double) x2 + vx * (mag + (double)distance) );
  py = (int) ( (double) y2 + vy * (mag + (double)distance) );

我在stackoverflow找到了这个解决方案,但我并不完全理解,请问有人能澄清一下吗?


4
或许你应该使用浮点数(floats)/双精度浮点数(doubles),因为这样可以避免出现舍入误差。这可能是一件令人担忧的事情。 - Lucas
1
路卡斯所说的。此外,您可能在我打错字时阅读了我的帖子。如果x1y1是原点,则要使用x1y1 + vxvy *(mag + distance),而不是x2y2。也就是说,从起点开始,您要沿着从x1y1到x2y2的方向行进距离_to x2y2_加上额外的距离。虽然我认为您可能需要重新表达您的问题。您想做什么?现在这个问题似乎更像一个中间问题。 - Mads Elvheim
几何学:找到一条线上距离另一点某一距离的点! - Sen Jacob
2个回答

36

我认为这应该放在MathOverflow上,但我会回答,因为这是您的第一篇帖子。 首先,您需要计算从x1y1到x2y2的向量:

float vx = x2 - x1;
float vy = y2 - y1;

然后计算长度:

float mag = sqrt(vx*vx + vy*vy);

将向量归一化为单位长度:

vx /= mag;
vy /= mag;

最后计算新向量,即 x2y2 + vxvy * (mag + distance)。
*px = (int)((float)x1 + vx * (mag + distance));
*py = (int)((float)y1 + vy * (mag + distance));

你可以省略一些与距离/大小相乘的计算。


17
很遗憾,MathOverflow太自命不凡了,无法解答这种问题;虽然这种问题确实应该在这里提出。 - Victor Liu
1
抱歉,如果这太简单了,我完全超出了我的正常能力范围。感谢您的帮助。 - amanda
5
干得好。曾经我是一名教授,而我最先学到的大课就是我以为简单的事情对别人来说并不简单。我喜欢 Stack Overflow 这个平台,它可以帮助我们互相提高。 - Mike Dunlavey
1
无论MathOverflow的优点是什么,编写正确的代码的任务实际上超出了MathOverflow人员的核心能力范围。我现在在MathOverflow上更活跃(我在那里有约3k声望),但我也会继续在SO上回答数学问题。在我看来,这两个网站互补得很好。 - ilya n.
1
+1 @Mads Elvheim - 谢谢。你真的帮了我大忙!:D 真遗憾那个人没有接受您的答案! - Duck
4
我认为这可以简单得多: *px = (int)((float)x2 + vx * distance)); *py = (int)((float)y2 + vy * distance)); - Nicolas Mommaerts

2

这些方程式是错误的:

px = (int) ( (double) x2 + vx * (mag + (double)distance) );

py = (int) ( (double) y2 + vy * (mag + (double)distance) );

正确的公式为:

px = (int) ( (double) x2 + vx * (double)distance );

py = (int) ( (double) y2 + vy * (double)distance );

汤姆


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接