本帖最后由 masterlong 于 2015-11-22 13:04 编辑
说说我现在所采用的方法
看截图
最早使用的是最小距离原则
现在引入换算长度的概念
所谓换算长度
除两点间距离外
再分别计算两点至各自块心的距离
并乘以一个系数k
以图中绿色虚线为例
整个换算长度=L1B*k+L1B2A+L2A*k
k的取值对最终连接效果影响很大
基本的规律是
k增大时连接点趋向于靠近形心
k减小时连接点趋向于远离形心
K=0时的换算长度即两点的实际距离
针对我的应用而言k=0.5~0.8之间比较合适
实际取值k=0.65
这种方法的优点是计算过程比较简单
相比前两贴所采用的方法
整个代码简洁的不是一点半点
实际效果能满足我的需要 - 以下是本帖我的程序中goodline子函数的代码
- (defun goodline( plist1 plist2 / midpo1 midpo2 mindi pa pb tmp k )
- (setq mp1 (getboxmidpo__2 aptlist))
- (setq mp2 (getboxmidpo__2 bptlist))
- (setq k 0.65)
- (setq mindi 1e100)
- (foreach x plist1
- (foreach y plist2
- (if (< (setq tmp (1234dist mp1 x y mp2 k)) mindi)
- (setq pa x pb y mindi tmp)
- )
- )
- )
- (drawline pa pb 3)
- )
- ;;求4点转换长度
- ;;若k=0,即求p2 p3间的距离
- ;;k值大,连接点趋向于靠近形心
- ;;k值小,连接点趋向于远离形心
- ;;临界点啊啥的,应该跟矩形的大小、长宽比有关系,没具体研究
- ;;对我的实际应用来说,k=0.5~0.8,是比较合适的取值
- (defun 1234dist( p1 p2 p3 p4 k )
- (+ (* k (distance p1 p2)) (distance p2 p3) (* k (distance p3 p4)))
- )
这个方法和院长的方法相比
某些情况下的连线效果略有不足
它对我个人而言最大的意义
在于它的适用性比较高
很多特殊的要求都可以借助它来实现
看下面截图
图中是一个房间内插座布置的几种相对关系
云线圈出的两插座处于同一面墙
绿色连续PL线是我希望的自动连线
当采用最小距离原则
一半的连线将如虚线所示
以前为解决此问题
插座的连接点如旁边的放大图设置了三个很近的点
而现在引入换算长度算法以后
连接点为两个
只需要设置k=-0.1即可
|