我有一个复杂的问题,它涉及对我不自信的数学的理解。
一些轻微的背景可能有所帮助。我正在为儿童建立一个3D训练模拟器,它将使用WebGL在浏览器中运行。我正在尝试创建一个点网络来放置轨道资产(见图)并为列车移动提供参考。
为了帮助解释我的问题,我创建了一个可视化表示,因为我是一个可以编写脚本而不是程序员或数学家的设计师:
基本上,我有3个形状(图A,B和C),虽然它们有宽度,但可以表示为A和曲线(B& C)的直线。曲线B& C是从A得到的(弯曲修改的)所以长度(l)都是112.曲线(B& C)各自的半径(r)为285.5,它们弯曲的角度(a)是22.5°。
每个形状(A,B和C)都有一个注册点(起点),每个形状都附有绿色框的中心。
我要做的是创建一个从0,0开始的“轨道”网络(使用标准的笛卡尔坐标)。
我的问题是在曲线后放置下一个元素的位置。如果它是直线轨道那么没有问题,因为我可以使用长度作为沿y轴的恒定偏移,但这将是无聊的,所以我需要添加曲线。
图。 D.演示了一个可能的轨道布局示例,但请理解我不是在寻找静态答案(基于图像中所有位置的位置),我需要一个可以应用的公式,无论我如何配置轨道。
使用图D.我试图找出在第一个弯曲元件之后放置第二个弯曲元件的位置。我使用公式绘制了圆的圆周点,给出了圆心的中心坐标和半径(图E)。
我有点1,因为这只是设置直线长度(y位置)的情况。我可以很容易地计算圆的中心,因为这只是偏移的y位置,半径(r)的偏移(x位置)和角度(a)总是22.5°(顺便说一下,它被转换为Radians根据公式要求)。
通过公式后的值我没有得到正确的结果,因为公式假设我从3点开始逆时针工作所以我不得不从(a)中扣除180并将其转换为Radians到得到预期的结果。
这确实有效,如果我想创建一个180°的曲线,我可以使用相同的中心点,每次从角度减去22.5°。大。但我想要一个更加动态的轨道布局,如图。 D& E.
那么,我将如何进入图E中的工作点5,因为它代表了该曲线段的中心点?我根本不知道。
另外,作为一个额外的问题,这是正确的做法,还是我过于复杂的事情?
这个问题是阻止我构建游戏的唯一问题,你可以理解,这有点大,所以我感谢任何人提前做出的贡献。
答案 0 :(得分:6)
在构建轨道时,要放置的下一条轨道的位置需要相对于轨道当前末端的位置和方向。
我会存储一个(x
,y
)位置和一个角度a
来表示当前点(x
,y
从0开始,和a
从pi / 2弧度开始,这对应于“逆时针3点钟”系统中的直线上升。
然后构建
fx = cos(a);
fy = sin(a);
lx = -sin(a);
ly = cos(a);
对应于“向前”和“向左”向量的x和y分量,相对于我们当前面向的方向。如果我们想将我们的位置向前移动一个单位,我们会将(x,y)增加(fx,fy)。
在您的情况下,放置直线部分轨道的规则是:
x=x+112*fx
y=y+112*fy
放置曲线的规则稍微复杂一些。对于向右转弯的曲线,我们需要向前移动112 * sin(22.5°),然后向右移动112 *(1-cos(22.5°),然后顺时针旋转22.5°。在代码中,
x=x+285.206*sin(22.5*pi/180)*fx // Move forward
y=y+285.206*sin(22.5*pi/180)*fy
x=x+285.206*(1-cos(22.5*pi/180))*(-lx) // Side-step right
y=y+285.206*(1-cos(22.5*pi/180))*(-ly)
a=a-22.5*pi/180 // Turn to face new direction
左转就像向右转,但是负角度。
要放置后续部分,只需再次运行此程序,使用现在更新后的{{1}值计算fx
,fy
,lx
和ly
然后根据接下来的轨道片段类型递增a
和x
。
您可以考虑另外一点;根据我的经验,如果你坚持做90°转弯或相当对称的布局,那么用这些碎片构建形成闭合环的轨道通常是有效的。但是,制作不完全连接的曲目非常容易,并且看到如何修改它们以允许它们加入并不明显。如果你的程序允许孩子们设计他们自己的布局,也可以记住一些事情。
答案 1 :(得分:0)
点5与3的距离等于2,但方向相反。