这是一个非常简单的问题,但我找不到答案,所以我正在为自己的嘲笑做准备。
给出一个向量:
(在这种情况下从2,3到9,9)我想从2,3开始向上传播距离为l的距离。
如何计算新点(x,y)?谢谢!
这是代码(在实施Dmitry方程式之后):
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个)。
德米特里的回答是正确的。
答案 0 :(得分:2)
您可以找到当前细分的长度,并计算您希望扩展(或收缩)细分的比例。
(2,3)至(9,9)
(9-2)^ 2 +(9-3)^ 2 =(c)^ 2
7 ^ 2 + 6 ^ 2 =(c)^ 2
定义a(a ^ 2)(c)^ 2 = l ^ 2
(a ^ 2)(7 ^ 2 + 6 ^ 2)=(a ^ 2)(c)^ 2 = l ^ 2
(7a)^ 2 +(6a)^ 2 =(ca)^ 2 = 1 ^ 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
只是一个结构,我持有双X和双Y。
答案 1 :(得分: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);