【发布时间】:2011-03-01 20:47:15
【问题描述】:
我正在编写一个模拟软件,需要一种有效的方法来测试沿线的碰撞。
模拟的是一列火车穿过轨道上的几个道岔。当轮子靠近开关 N 英寸时,开关打开,然后在轮子离开时关闭。由于所有车轮的尺寸相同,并且所有开关的尺寸相同,因此我可以将它们表示为沿轨道的单个坐标 X。一旦设置,开关距离和车轮距离就不会相互改变。
当通过将 X 坐标放在列表中并遍历它们通过蛮力完成时,这是一个相当微不足道的问题,但我需要一种有效的方法,因为它需要非常准确,即使火车正在移动在高速。有大量关于 2D 碰撞检测的教程,但我不确定处理这种独特的 1D 场景的最佳方法。
显然我的数据看起来有些混乱。
我模拟的是单个站点,而不是整个区域。火车可以是任意长度,有不同类型的车厢,但只有一列火车。我的火车数据格式为{48,96,508,556,626,674,...},表示火车前部(0)到车轴中心的距离。
(火车数据更有可能以有序列表的形式出现在我面前Car对象,每个对象都有一个长度和一个表示轴距的整数列表那辆车的前部,但所有这些都汇总到一个列表中,因为所有车轴对我来说都是一样的。)
我的开关都在几百英尺之内,而且经常会被火车完全覆盖,开关可以相距数百英尺到几英寸的任何间隔,并且与火车的形式相同:@987654324 @,表示站点起点到开关中心的距离。
最后,我知道了车轮启动开关的距离,以英寸为单位。
例如,使用上面的示例数据和 8 英寸的激活距离,当火车到达 X=40 时,X=0 处的第一个开关将激活,这意味着火车进入站点 40 英寸。当火车到达 X=48 时,X=8 处的开关也被激活。在 X=56 时,第一个开关断开,在 X=64 时,第二个开关也断开。不同的车轴在穿过场地时打开和关闭不同的开关。
火车通常以低于 10 英里/小时的速度运行,但可以走得更高。 (目前我们的模拟速度上限为 30 mph,但更高会更好。)
【问题讨论】:
-
嗯......(对我来说)显而易见的答案是采用 2D 解决方案并对其进行调整 - 最简单的方法是始终使一个维度保持不变(所有事物的 y 坐标都为 0)。这些解决方案不能轻易适应是有原因的吗?
-
那么你的数据集是什么样的?你只是有位置(到一个点的绝对距离)还是你有可以掩盖的东西?
-
我在上面添加了一些示例数据。你是什么意思“面具反对”?我可以将列表中的数据转换为其他结构。
-
@FrustratedWithFormsDesigner:鉴于数据的静态性质和单一维度,我认为 2D 解决方案完全是矫枉过正。
-
轴之间的距离可以小于激活的距离吗?
标签: c# .net algorithm simulation collision-detection