;(goodline s1 s2 宽度系数)
哈哈,看来楼主是个完美主义者啊 本帖最后由 masterlong 于 2015-11-19 22:16 编辑
院长的演示相当完美
必须要赞一个
简单说说以前我对此问题的一些思考
看截图
先讨论两图块平行的情况
任选图块之一作为主块
以距图块长轴距离为L做一直线
以长边的1/4点做一个角度为A的区域划分线
如图中虚线所示
对于两个4点表而言
其实可以简化为2个2点表
如图中紫红色点所示
做了区域划分线以后
如果点P2A、B都在区域线之内
那么连接点为P1A、P2A
如果点P2A、B都在区域线之外
那么连接点为P1B、P2B
如果P2A、P2B分别在区域线两侧
那么连接点为P1A、P2B
按以上原则
对于两图块平行的情况
可以得到很好的连接效果
对于互相垂直的情况
分别调整A与L具体数值
同时两块分别假定为主块进行验算
最后也能得到理想的结果
对于两图块成一定角度
或者图块大小不一的情况
确定最优连线的计算过程类似
一直不能让我满意的
是整个计算很有点繁琐
程序代码里面
cond套cond
L与A的具体数值调整起来很麻烦
经常会出现顾此失彼的情况
编辑以后怎么删除错误的图片啊 masterlong 发表于 2015-11-19 22:17 static/image/common/back.gif
编辑以后怎么删除错误的图片啊
图片下方有个"删除" ,点击即可 院长给出了思路
感觉比我所采用的方法
更为精准
由于最近比较忙
还没来得及仔细研究
暂不能判断该方法的扩展性如何
因为我有很多特殊的应用
本帖仅列举了其中一类
无论如何
院长的思路都是超赞的 本帖最后由 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 xpb ymindi 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即可
同一墙面的,这样连接是不是更美观一点呢
直接在画圈圈的那个位置加一个点,就可以很完美的解决了
这个是个人的绘图习惯
页:
1
[2]