1

这是一个非常简单的问题,但我找不到答案,所以我准备好接受嘲笑。

给定一个向量: 在此处输入图像描述

(在这种情况下,从 2,3 到 9,9)我想从 2,3 开始,沿着向量向上移动一段长度为 l 的距离。

如何计算新点 (x,y)?谢谢!

这是代码(在实现了德米特里的方程式之后):

 double MetersMoved = ((Dinosaurs[i].Speed * 1000) / (60 * 60)) * TimeStepInSecs;
 double fi = Math.Atan2((Dinosaurs[i].Goal.Y - Dinosaurs[i].Head.Y),(Dinosaurs[i].Goal.X - Dinosaurs[i].Head.X));
 Dinosaurs[i].Head.X = Dinosaurs[i].Head.X + MetersMoved * Math.Cos(fi);
 Dinosaurs[i].Head.Y = Dinosaurs[i].Head.Y + MetersMoved * Math.Sin(fi);

恐龙在正确的矢量上对齐,但没有前进(一个应该移动 2 个像素,另一个应该移动大约 7 个像素)。

德米特里的回答是正确的。

4

2 回答 2

3

您可以找到当前段的长度并计算要扩展(或收缩)该段的比例。

(2,3) 至 (9,9)

(9-2)^2 + (9-3)^2 = (c)^2

7^2 + 6^2 = (c)^2

定义一个使得 (a^2)(c)^2 = l^2

(a^2)(7^2 + 6^2) = (a^2)(c)^2 = l^2

(7a)^2 + (6a)^2 = (ca)^2 = l^2 => l = ca => a = l/c

然后,您可以相应地扩展 x 和 y 坐标

(2+7*l/c, 3+6*l/c) 是您的新端点。

Point p1 = new Point(2.0, 3.0);
Point p2 = new Point(9.0, 9.0);
double l = 25.0;

Point vector = new Point(p2.X - p1.X, p2.Y - p1.Y);
double c = Math.Sqrt(vector.X * vector.X + vector.Y * vector.Y);
double a = l / c;

Point p3 = new Point(p1.X + vector.X * a, p1.Y + vector.Y * a);

//Writes "25"
Console.WriteLine(Math.Sqrt((p3.X - p1.X) * (p3.X - p1.X) + (p3.Y - p1.Y) * (p3.Y - p1.Y))); 

Point只是一个结构 I 来保存一个双 X 和双 Y。

于 2013-07-18T14:20:50.670 回答
1

解决方案(三角函数)可能是这样的:

  // Origin point (2, 3)
  Double origin_x = 2.0;
  Double origin_y = 3.0;  

  // Point you are moving toward
  Double to_x = 9.0;
  Double to_y = 9.0;

  // Let's travel 10 units 
  Double distance = 10.0;

  Double fi = Math.Atan2(to_y - origin_y, to_x - origin_x);

  // Your final point
  Double final_x = origin_x + distance * Math.Cos(fi);
  Double final_y = origin_y + distance * Math.Sin(fi);
于 2013-07-18T13:47:30.520 回答