线性分段算法实现


算法很简单,先看图:

如上图,一条线,从点1开始到点6结束,共由五段直线组成,总长为13m,现在的需求是:找出距离起点五米的点的坐标。

  1. 我们可以把五条线段组成一个数组(有顺序的
  2. 然后从第一个线段开始累加比较,一直累加到第三条线段的时候发现当前的长度刚好超出了5米:2m+2m+4m>5m了,所以距离起点五米的点一定位于第三条线段上。
  3. 于是我们以第三条线段的第一个端点也就是点三为圆心,以(2m+2m+4m-5m)为半径画一个圆。
  4. 然后将这个圆和第三条线段做一个相交运算,取得相交点,这个点就是我们要找的点了,如下图:




第二种需求更进一步,综合一些,用户在公路上点击某个地方,然后判断这个点在哪个线段内,这里要注意的是,别指望用户的鼠标可以很精确地点在线上,绝对会有偏差的,如图:用户点想点击第三个线段,但是鼠标并没有准确地落在线上。

  1. 还是把这条线,打断成一个个线段,段组成一个数组(有顺序的
  2. 然后设定一定的容限(用户的点击虽然会有误差,但是一般不会太离奇)。
  3. 以点击的这个点为圆心,以设定的容限为半径作圆。
  4. 将这个圆和这个线段数组做相交运算,得到和这个圆相交或包含的线段,成为结果集作为下一步的数据源。
  5. 遍历这个结果集,对于每条线段,都做一条与它垂直而且经过这个点(就是只用户点击的这个点)的直线。
  6. 如果这个直线和当前这条线段有交点,那么说明,这个线段就是离这个点最近的线段了,如图,我这里夸张一下,把容限设得很大,这种情况是很有可能出现的,只要你的线的线段分得很细很细
  7. 由图中可以看到,一共有四条线段和圆相交或被包含,分别经过这个点给这些线段做垂线(图中四条土黄色的线就是对应的四条垂线,其编号对应线段号),经过观察发现,就只有线段三的垂线和线段三有交点,同时,线段三也是离这个点最近的线段!根据这个方法就可判断出哪一条线段是离这个点最近的!
很晚了,这里先说说思路,代码实现等日后有空再写了

转载于:https://my.oschina.net/LinBandit/blog/107833

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值