C++ 给定起点和终点以及距离,沿直线计算一个点
寻找计算直线上的点的最快方法 距离直线端点的给定距离:C++ 给定起点和终点以及距离,沿直线计算一个点,c++,c,math,graphics,vector,C++,C,Math,Graphics,Vector,寻找计算直线上的点的最快方法 距离直线端点的给定距离: 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 = ??? } 谢谢你的回复,不,这不是家庭作业,
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度计算一次点
一个圆作为起点,调用下面的函数,圆心为x2,y2,距离为4。终点完全错误。它们位于中心的下方和右侧,长度与中心点一样长。有人有什么建议吗
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的解决方案,但还不完全理解,有人能澄清一下吗?我认为这属于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相乘的计算。这些公式是错误的:
正确的方程式为:
汤姆也许你应该使用浮动/双精度,因为你会得到舍入误差。这可能是个问题,卢卡斯说的。还有,你可能在我打字时读了我的帖子。如果x1y1是原点,则需要x1y1+vxvy*(磁距+距离),而不是x2y2。也就是说,从原点开始,使用从x1y1到x2y2的方向,移动到x2y2的距离加上额外的距离。虽然我想你可能想重新表述你的问题。你到底想做什么?现在的问题似乎更像是一个中间问题。不幸的是,mathoverflow太势利了,不能接受这种问题;它确实属于这里。抱歉,如果它太简单了,伙计们,完全超出了我的能力范围。谢谢你的帮助,干得好。我曾经是一名教授,我学到的第一个也是最大的一课是,我认为简单的东西对别人来说并不简单。不管MathOverflow有什么优点,编写正确代码的任务实际上超出了MathOverflow员工的核心能力。我现在在MathOverflow上更加活跃(我在那里有大约3k的代表),但我也会继续回答数学问题。在我看来,这两个站点可以很好地互补。我认为这可能更简单:*px=(int)((float)x2+vx*距离))*py=(int)((浮点)y2+vy*距离);
*px = (int)((float)x1 + vx * (mag + distance));
*py = (int)((float)y1 + vy * (mag + distance));
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 );