发布网友 发布时间:2024-07-03 03:43
共6个回答
热心网友 时间:2024-07-09 20:17
如图 B点 可能是在 两个离A点很远的 两个相邻拐点之间的连线上 所以仅考虑局部是不行的
所以只考虑离A点最近的几个拐点肯定是不正确的 除非这些拐点有别的约束条件
不过我倒是有个可以减少距离运算(平方运算 或者说乘法运算)的想法
首先 B点有可能在离A点较近的拐点或其线段上
那么对于这种情况 我们先求出 拐点中最大和最小的横纵坐标
即max(X) min(x) max(Y) min(Y) 四个数 目的是求出这些点的范围
即max(X)<X<min(x) max(Y)<Y<min(Y)
这要是已知更好 不知道你用什么语言的程序 或者编译器
不少编译程序都有自己的函数来完成这个运算 无论怎样 本质只是些比大小运算(减法运算)
然后求Lx=max(X)-min(x) Ly= max(Y)-min(Y) 即范围大小
知道范围了 咱就以A为中心 制定个范围 Xa-k*Lx<X<Xa+k*Lx Ya-k*Ly<Y<Ya+k*Ly
其中k为范围因数 在0-1之间 可以先设为0.1
然后以此判断各拐点是否在范围里
(各拐点的X Y与Xa Ya对应相减 判断差的绝对值是否分别小于k*Lx和k*Ly )
(差值保留 避免重复计算)
如果范围里的点数过多就调大k 过少就调小k
因为这是矩形区域 可能没那么精确 但是避免了乘法运算
然后再在这些点里再判断拐点与A的距离 以及如有相邻拐点 判断与其线段距离
其次 对应如图情况 还没想到什么太好的办法
不过发生这种情况的前提是
相邻两个拐点的横坐标 跨越Xa (Xa在两拐点横坐标之间)
或者 对应的 相邻两个拐点的纵坐标 跨越Ya
你可以按这个思路来找
或者如果相邻两点的|Xn-Xm|+|Yn-Ym|大于某个值L (两点距离的粗略估计 减少乘法运算)
这个L与你的k*Lx 和k*Ly 有一定关系 可以先设定个值试试
如果满足大于L则 在这两个点间插入一个点 或多个点 (如中点 四分之一点等)
|Xn-Xm|+|Yn-Ym| 值越大插入点应该越多
你可以多设几个L 如大于L1插入中点 大于L2 插入四分之一处点 中点 以及四分之三处点
这个方法可能不太好 算是我不成熟的想法吧
但愿对你有所帮助
热心网友 时间:2024-07-09 20:18
其实几十万点的数据规模用循环一点都不慢的,我实际测试了一下做了1亿次点到直线距离平方的计算,没有超过40秒
热心网友 时间:2024-07-09 20:18
到折线最短的距离为0
热心网友 时间:2024-07-09 20:19
说来惭愧,数学系出来已经忘记数学所有的东西了。热心网友 时间:2024-07-09 20:19
问楼主:在给出点A之前,允许进行多少准备计算?热心网友 时间:2024-07-09 20:20
以A为圆心,与A最近或在视觉上最近的一点X为半径作圆,如折线穿过此圆,则A到圆内的线段的垂线为最短,垂足则为B,若折线不穿过此圆,则X为B。