2013-07-18 39 views
1

这是一个非常简单的问题,但我找不到答案,所以我支持自己的嘲笑。给定一个向量,计算一个点距离l

给定一个矢量: enter image description here

(在这种情况下会从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)。

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

+0

你尝试过什么双X和Y的两倍?你用Google搜索了什么?用三角函数做什么? 'Math.Cos'? 'Math.Sin'? 'Math.Atan2'? –

+1

x_new = x + l * Math.Cos(fi); y_new = y + l * Math.Sin(fi);其中fi是角度,在你的情况Math.Atan2(9 - 3,9 - 2) –

+1

看起来像解决方案在这里:http://stackoverflow.com/questions/1800138/given-a-start-and-end-点到点距离计算一点一线?rq = 1 – zetar

回答

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); 
+2

绝对不需要trig。不需要Atan2。它只是掩盖了简单的矢量操作。只需用'to-origin'形成矢量,然后重新归一化为所需的长度(需要欧几里德长度计算)。最后加上'origin'。 –

1

您可以找到当前线段的长度,计算其要展开(或合同)段的比例。

(2,3)至(9,9)

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

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

限定使得(a^2)(c)中^ 2 = 1^2

(A^2)...(7^2 + 6^2)=(一个^ 2)(c)^ 2 = 1^2

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

然后,您可以根据需要扩展x和y坐标

(2 + 7 * 1/c,3 + 6 * 1/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只是一个struct我持有

相关问题