在C#中将点移动到另一个位置

5

我想将二维搜索空间中的某个点a移动到另一个点b,步长为(_config.StepSize = 0.03)。

Point a = agent.Location;
Point b = agentToMoveToward.Location;

//---    important        
double diff = (b.X - a.X) + (b.Y - a.Y);
double euclideanNorm = Math.Sqrt(Math.Pow((b.X - a.X), 2) + Math.Pow((b.Y - a.Y), 2));
double offset = _config.StepSize * ( diff / euclideanNorm );

agent.NextLocation = new Point(a.X + offset, a.Y + offset);
//---

这是否正确?


你试了哪些测试案例? - Eric Lippert
2
毕达哥拉斯挥舞着他的手杖对欧几里得喊道:“离开我的草坪!” - Hans Passant
1
总之,不行。您的euclideanNorm基本上是斜边,我不确定diff的意图是什么,即使正确计算了偏移量,它也会被等量地添加到x和y上,这意味着以45度角迈出一步(如果有步骤)。您需要查看向量的角度并将其与斜边一起使用以确定新的x和y位置。可能有一些聪明的方法可以更快地计算,而不是使用勾股定理,但它也会奏效。 - Lazarus
你想要在循环中直接从一个位置(a)移动到另一个位置(b)吗? - petro.sidlovskyy
1
@Hans Passant:该死的欧几里得,他总是喝醉了睡在我的草坪上。 - Lazarus
1个回答

14
假设您想将一个点朝另一个点移动,并假设您的步长具有距离单位,则不,您的计算是不正确的。
正确的公式是:
nextLocation = a + UnitVector(a, b) * stepSize 在C#中,只使用简单的Point类和Math库,这看起来像:
public Point MovePointTowards(Point a, Point b, double distance)
{
    var vector = new Point(b.X - a.X, b.Y - a.Y);
    var length = Math.Sqrt(vector.X * vector.X + vector.Y * vector.Y);
    var unitVector = new Point(vector.X / length, vector.Y / length);
    return new Point(a.X + unitVector.X * distance, a.Y + unitVector.Y * distance);
}

编辑: 根据TrevorSeniors在评论中的建议更新了代码


这段代码不能直接编译。length 是一个双精度浮点型,它的值总是大于用来创建它的向量的 X/Y 分量。这意味着 new Point() 的值总是 {0,0}。 - Brad
@Brad: 这个问题没有明确指出使用的是哪个Point类。你说得对,上面的代码假设了一种支持double类型的类(比如System.Windows.Point或自定义类)。当使用System.Drawing.Point或其他基于整数的点类时,代码需要相应地进行调整。 - Rick Sladkey
啊哈,有趣!我不知道 System.Windows.Point 类。很好。 - Brad
5
这帮了我很多。你的返回语句中的 XY 是否有误?例如应该是 a.Y + unitVector.Y 而不是 a.X?这样对我有用,虽然我的情况可能不同。 - Jay

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