算法很简单,先看图:
如上图,一条线,从点1开始到点6结束,共由五段直线组成,总长为13m,现在的需求是:找出距离起点五米的点的坐标。
- 我们可以把五条线段组成一个数组(有顺序的)
- 然后从第一个线段开始累加比较,一直累加到第三条线段的时候发现当前的长度刚好超出了5米:2m+2m+4m>5m了,所以距离起点五米的点一定位于第三条线段上。
- 于是我们以第三条线段的第一个端点也就是点三为圆心,以(2m+2m+4m-5m)为半径画一个圆。
- 然后将这个圆和第三条线段做一个相交运算,取得相交点,这个点就是我们要找的点了,如下图:
第二种需求更进一步,综合一些,用户在公路上点击某个地方,然后判断这个点在哪个线段内,这里要注意的是,别指望用户的鼠标可以很精确地点在线上,绝对会有偏差的,如图:用户点想点击第三个线段,但是鼠标并没有准确地落在线上。
- 还是把这条线,打断成一个个线段,段组成一个数组(有顺序的)
- 然后设定一定的容限(用户的点击虽然会有误差,但是一般不会太离奇)。
- 以点击的这个点为圆心,以设定的容限为半径作圆。
- 将这个圆和这个线段数组做相交运算,得到和这个圆相交或包含的线段,成为结果集作为下一步的数据源。
- 遍历这个结果集,对于每条线段,都做一条与它垂直而且经过这个点(就是只用户点击的这个点)的直线。
- 如果这个直线和当前这条线段有交点,那么说明,这个线段就是离这个点最近的线段了,如图,我这里夸张一下,把容限设得很大,这种情况是很有可能出现的,只要你的线的线段分得很细很细:
- 由图中可以看到,一共有四条线段和圆相交或被包含,分别经过这个点给这些线段做垂线(图中四条土黄色的线就是对应的四条垂线,其编号对应线段号),经过观察发现,就只有线段三的垂线和线段三有交点,同时,线段三也是离这个点最近的线段!根据这个方法就可判断出哪一条线段是离这个点最近的!