【问题标题】:Move point to another in c#在c#中将点移动到另一个
【发布时间】:2015-08-21 20:01:45
【问题描述】:

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

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);
//---

对吗?

【问题讨论】:

  • 嗯,你尝试了哪些测试用例?
  • 毕达哥拉斯对着欧几里得摇着棍子:“滚开我的草坪!”
  • 一句话,没有。你的 euclideanNorm 基本上是斜边,我不确定 diff 打算给你什么,偏移量,即使计算正确,也被添加到 x 和 y 中,同样意味着 45 度角的一步(如果有一步完全)。您需要查看矢量的角度并将其与斜边一起使用来确定新的 x 和 y 位置。可能有一些聪明的方法可以比毕达哥拉斯更快地计算出来,但它会起作用。
  • 你想将它直接从一个位置(a)移动到另一个位置(b)吗?
  • @Hans Passant:该死的 Euclid,他总是醉醺醺地过来,也在我的草坪上睡觉。

标签: c# math geometry


【解决方案1】:

假设您的意思是将一个点移向另一个点,并假设您的步长具有距离单位,那么不,您的计算不正确。

正确的公式是:

  • 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);
}

编辑:根据 cmets 中 TrevorSeniors 的建议更新代码

【讨论】:

  • 这不会按原样编译。 length 是一个双 并且 将始终大于生成它的向量的 X/Y 分量。这意味着 new Point() 将始终为 {0,0}。
  • @Brad:这个问题没有明确说明使用的是哪个Point 类。你是对的,上面的代码假设一个支持像 System.Windows.Point 这样的双精度或自定义类的代码。当使用System.Drawing.Point 或其他基于整数的点类时,需要相应地调整代码。
  • 啊有趣!我不知道 System.Windows.Point 类。不错
  • +1 这对我帮助很大。你的XY 在return 语句中是否错误?例如应该是a.Y + unitVector.Y 而不是a.X?这让它对我有用,尽管我的情况可能不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
相关资源
最近更新 更多