如何使用角度和坐标找到距离为d的点

时间:2015-02-12 17:04:15

标签: ruby geometry game-physics libgosu

(使用Ruby和Gosu)

我有一个单点对象代表一个朝某个方向看的人。

我有三个变量,xy(男人的2d坐标)和@angle(他所面对的方向,以度为单位)。如果我想在该人面前找到xyd(让它变为20)的距离(在其他方向上的话中的话)他面临着),我该如何计算呢?

  def move
    # Move
    @x += @vel_x
    @y += @vel_y

    # HELP
    @point_in_front_of_me_x = # some_function_for_x(@x, @y, @angle)
    @point_in_front_of_me_y = # some_function_for_y(@x, @y, @angle)

    # Prevent window exit
    @x %= @window.width
    @y %= @window.height

    # Simulate air resistance
    @vel_x *= 0.95
    @vel_y *= 0.95
  end

如果您了解Gosu图书馆或手动方式,则可以这样做。如果你们都知道并且可以指出好处,那就更好了!

1 个答案:

答案 0 :(得分:1)

我不知道Gosu库(或它使用的坐标系),但手动解决方案是使用三角法。你知道三角形的角度和斜边(h,移动的距离),你试图计算x坐标(相邻边的长度b)和y坐标(长度)相反的一面,a)。

triangle

我们可以计算x_after_moving(使用以人的当前位置为中心的坐标系 - 如果需要,你应该能够轻松地将其调整到另一个坐标系),使用关系sin(angle)=opposite/hypotenuse并重新排列(我们这里只有一个未知,对面(b)):

def x_after_moving(distance, angle)
  distance * Math.sin(angle * Math::PI / 180)
end

我们乘以pi / 180来从弧度(Ruby期望的)转换为度数。同样,知道关系cos(angle)=adjacent/hypotenuse,我们可以使用类似的方法来计算新的y坐标:

def y_after_moving(distance, angle)
  distance * Math.cos(angle * Math::PI / 180)
end

验证它是否适用于以下内容:

p 'Angle 0 (straight up)'
p 'x:' + x_after_moving(20, 0).to_s + ', y:' + y_after_moving(20, 0).to_s
p 'Angle 90 (right)'
p 'x:' + x_after_moving(20, 90).to_s + ', y:' + y_after_moving(20, 90).to_s

给我们:

"Angle 0 (straight up)"
"x:0.0, y:20.0"
"Angle 90 (right)"
"x:20.0, y:1.2246467991473533e-15"

在某些情况下,您可能会获得非常小的值而不是零 - 舍入应该可以解决此问题y_after_moving(20, 90).round