(使用Ruby和Gosu)
我有一个单点对象代表一个朝某个方向看的人。
我有三个变量,x
,y
(男人的2d坐标)和@angle
(他所面对的方向,以度为单位)。如果我想在该人面前找到x
和y
点d
(让它变为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图书馆或手动方式,则可以这样做。如果你们都知道并且可以指出好处,那就更好了!
答案 0 :(得分:1)
我不知道Gosu库(或它使用的坐标系),但手动解决方案是使用三角法。你知道三角形的角度和斜边(h
,移动的距离),你试图计算x坐标(相邻边的长度b
)和y坐标(长度)相反的一面,a
)。
我们可以计算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
。