继上篇文章,通过高精度数据可以知道当前车辆的位置,结合考试地图建立好坐标系。那么车辆在这个地图中的一切行为轨迹都将是可以计算的,可以想象成一张蜘蛛网中蜘蛛的移动。那么接下来就是要利用这些数据来做评判了:判断当前车辆是否压线,以及打灯的时长是否足够等等。
信号评判
信号评判是通过车辆信号来做条件评判,看是否需要扣分。举个栗子:
1 | /** |
当项目开始后,检测项开始检测是否需要扣分。如果是左转弯,进项目时不能打右转灯;如果是右转弯,进项目是时不能打左转灯。根据产品需求,需要写很多这样类似的评判,覆盖到方方面面。
碰撞评判
信号只是最基础的一类评判,在科二考试系统中还有个最重要的一种评判就是「碰撞评判」,通俗解释就是车子是否压线,这个线可以是实际考场中的一条线,也可以是产品需求定义的一条虚拟的线。前面的多篇文章,获取高精度数据就是为了实现「碰撞评判」。
通过建立坐标系,将整个地图绘制成各种类型的线(包括曲线),同时将车子建模,可以近似当成一个矩形。那么压线就可以抽象成一个数学题了:矩形是否与线段(或直线)相交。
于是便有了很多的数学模型及工具类方法:
1 | /** |
线:
1 | /** |
三角形:
1 | /** |
矩形:
1 | /** |
将车子抽象成一个类:
1 | /** |
然后车子碰撞的工具类:
1 | /** |
主要就是一些数学概念:坐标系、点、向量、线、三角形、矩形,然后勾股定理,向量的点乘、叉乘等方法。方法非常多,也不是一下子就写完的,都是业务需求一点点完善,发展到现在这个样子,很多方法还没深入研究它的原理。毕业之后数学便丢得差不多了,现在要捡起来还得费点工夫。
依赖上述那些便可以做「碰撞评判」了:
1 | /** |
总结
科二考试系统这个系列文章算是写完了,主要根据项目经验做的一点总结,代码几乎都是些工具类方法,主要还是核心思想。系列文章链接来一波: