c# – 实现一维碰撞检测的最佳方法是什么?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 实现一维碰撞检测的最佳方法是什么?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2466字,纯文字阅读大概需要4分钟。
内容图文
![c# – 实现一维碰撞检测的最佳方法是什么?](/upload/InfoBanner/zyjiaocheng/825/bacf8125d32d43da9f7c29d4ef8fc32a.jpg)
我正在编写一个模拟软件,需要一种有效的方法来测试沿线的碰撞.
模拟的是火车穿越轨道上的几个开关.当车轮在开关N英寸范围内时,开关打开,然后在车轮离开时关闭.由于所有车轮尺寸相同,并且所有开关尺寸相同,我可以将它们表示为沿轨道的单个坐标X.一旦设定,开关距离和车轮距离就不会相互改变.
当通过将X坐标放入列表并遍历它们时通过蛮力完成这是一个相当微不足道的问题,但我需要一种有效的方法,因为它需要非常准确,即使列车高速移动.有大量关于2D碰撞检测的教程,但我不确定这种独特的1D场景的最佳方法.
显然,我的数据看起来有些混乱.
我正在模拟一个站点,而不是整个区域.火车可以是任何长度的,有不同类型的汽车,但只有一列火车.我的列车数据格式为{48,96,508,556,626,674,…},表示从火车前部(0)到车轴中心的距离.
(列车数据更有可能以Car对象的有序列表的形式出现在我的身上,每个Car对象都有一个长度和一个整数列表,表示距离该车前部的车轴距离,但它们都汇总到一个列表中,因为所有车轴对我来说都是一样的.)
我的开关都在几百英尺范围内,通常完全由火车覆盖.开关可以间隔数百英尺到几英寸,与火车的形式相同:{0,8,512,520, …},表示从站点开始到交换机中心的距离.
最后,我知道车轮启动开关的距离,以英寸为单位.
例如,使用上述样本数据和8英寸的激活距离,当列车到达X = 40时,X = 0处的第一个开关将激活,这意味着火车距离现场40英寸.当火车到达X = 48时,X = 8的开关也被激活.在X = 56时,第一个开关熄灭,而在X = 64时,第二个开关也熄灭.不同的轴在穿过现场时打开和关闭不同的开关.
火车通常以低于10英里/小时的速度运行,但可以更高. (现在我们的模拟时速仅为30英里/小时,但更高会更好.)
解决方法:
将您的开关位置和灵敏度范围预处理为轨道段列表.每个段都有一个长度,每个段之间有一组开关’开’或’关’事件.
switch_on ( 0 ), ( length: 8 ), switch_on ( 1 ), // x = zero here
segment ( length: 8 ), switch_off ( 0 ),
segment ( length: 8 ), switch_off ( 1 ),
segment ( length: 488 ), switch_on ( 2 ),
segment ( length: 8 ), switch_on ( 3 ),
segment ( length: 8 ), switch_off ( 2 ),
segment ( length: 8 ), switch_off ( 3 ),
...
对于每个轴,其当前位置也与其所在的轨道段一起表示.
如果您正在进行基于事件的模拟,则应为下一个事件安排从轴到其当前轨道段末端的最小值.这与列车速度无关,而且准确(如果列车速度更快,您不会错过开关).如果需要,将事件存储在堆中(通常不到30左右就不值得,如有必要,可以对事件进行调度).
处理事件将是O(无轴).大多数步骤将涉及一个或两个开关状态更改和位置更新.在每个事件中,一个轴将导致一个开关接通或断开(根据数据同时开关导致两个事件,零时间间隔),并且需要比较其段的末端的所有轴时间.您可以假设所有车轴都以相同的速度行驶;在处理事件时无关紧要,它只计算到达相关轴的下一个开关的时间.
如果您正在进行固定时间步模拟,则处理在步骤结束时可能发生的所有事件,然后将一个事件移动到它们在步骤结束时到达的点.
内容总结
以上是互联网集市为您收集整理的c# – 实现一维碰撞检测的最佳方法是什么?全部内容,希望文章能够帮你解决c# – 实现一维碰撞检测的最佳方法是什么?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。