svg 折线添加新的折点

问题

现有已知折线 有多段,当双击折线的时候,需要将该双击的位置点Q 添加到折线上(排除端点情况),如何去判断Q要添加在折线的哪一段,或者Q分割了折线的哪一段??

分析

方式1
一开始选用斜率计算,即平面中三点m,n,Q, Q与m,n 任意一点连线的斜率 与 m,n 连线斜率相同,则三点共线(与之相似的还有计算向量叉乘等,都是基于斜率的判断),这思路在纯粹的数学模型中是没问题的,但是在js中会有以下问题

  • js浮点运算并不准确,在计算斜率的时候会丢失精度
  • 即使设置了阈值,但是精度丢失的程度根据m,n两点连线的斜率有关,因此并不能有效的设置阈值,无效的阈值是指,当阈值较小的时候,计算误差会容易大于阈值,导致新增点不属于任何线段,当阈值较大的时候,计算误差会容易小于阈值,导致新增点永远被判定为最后一段。

方式二
鉴于以上测试结果,使用另一个判断标准,点到直线的距离,即使浮点运算不准确,仍可以设置一个有效的阈值,当Q距离已知线段的距离为[0,阈值],且与线段两端点方向相反(区分多端斜率相同的线段)的时候就判断Q在直线上。
实际开发中需要分析线宽,新增折点触发时机等设置具体的阈值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值