明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2946|回复: 17

[已解答] 点表连线求最优算法

[复制链接]
发表于 2015-8-20 17:20:35 | 显示全部楼层 |阅读模式
本帖最后由 kele99kele 于 2015-8-21 14:13 编辑

已知点表,排列布置为下图:

目的为做所有点的连线,确保每个点与周围最近的点均保持连接(点表为空间点,z坐标

不同)希望实现如下图所示:

设计思路:每个点与点表所有成员测量距离,在距离≤设置值的时候,做两点连线,

所绘线段加入选择集,图完毕选择所绘制的线段查找重复单元并删除重复obj。

缺点:当点表排布不均匀时
1.设置距离过大会越过最近点向下一个点连线。
2.当设置距离过小时会漏掉部分必要连线
如下图:

求思路优化

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2015-8-20 19:16:16 | 显示全部楼层
这个似乎很难的哦。你看,就连那么成熟的cass生成的三角网都不是那么规矩的。
 楼主| 发表于 2015-8-21 08:57:18 | 显示全部楼层
newbuser 发表于 2015-8-20 19:16
这个似乎很难的哦。你看,就连那么成熟的cass生成的三角网都不是那么规矩的。

cass三角网生成的点位需要计算,那个是比较困难的,我只是想实现已经定好点位的连线,应该要简单好几个数量级的
 楼主| 发表于 2015-8-21 13:49:05 | 显示全部楼层
没有人愿意出手,我先把我的笨办法贴上来吧,欢迎指正
  1. (defun N::MakeLineFromPointList (lst maxdistance / ptn lsts)
  2.   (setq lsts lst)
  3.         (while lsts
  4.                 (setq ptn (car lsts))
  5.                 (foreach x lst
  6.                         (if (and (> (distance ptn x) 0) (< (distance ptn x) maxdistance))
  7.                                 (command "LINE" ptn x "")
  8.                         )
  9.                 )
  10.                 (setq lsts (cdr lsts))
  11.         )
  12. )

点评

好象时间复杂度本来只需要(*n(1- n)0.5)的,好象楼主这样需要n*n?  发表于 2015-8-22 09:24
 楼主| 发表于 2015-8-21 13:52:37 | 显示全部楼层
本帖最后由 kele99kele 于 2015-8-21 14:17 编辑

设定的maxdistance不同,生成的连线区别很大,而且随point的分布情况会有很多不同

第一种点:

这张图是理想连线





第二种点:

这张图是理想连线


怎么算出最优连线的设置距离呢,这个现在一点思路也没有

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2015-8-23 08:59:18 来自手机 | 显示全部楼层
你的算法有重复,应该是第一项和二项之后比较,二项和三项之后比较,以此循环。。。。
再提个思路,一个点只能和最近的最多4个点相连接,且连线不相交。

点评

恩,算法的问题导致最终连线都是双线,没办法又编一个删除重线的程序,很影响速度  发表于 2015-8-26 08:59
发表于 2015-8-23 09:28:12 | 显示全部楼层
感觉maxdistance不会是个固定值,而是要动态调整的,在点密集的地方,这个值需要变小

点评

是的是的,点越密集,maxdistance越小才能正确连线,这个值如果动态判断赋值我没有思路啊  发表于 2015-8-26 09:00
发表于 2015-8-24 17:54:56 | 显示全部楼层
说说我的思路:
1  先出所有点的点表b1   '(pt1 pt2 pt3 pt4 ...) 。
2  算出第一点与其它点的连线的点表b2  '( '(pt1 pt2) '(pt1 pt3)...)  。将该点从b1中删除,  '(pt2 pt3 pt4 ...)。

3 算出第2点与其它点的连线的点表b3   '( '(pt2 pt3) '(pt2 pt4)...)  .  将该点从b1中删除,(pt3 pt4 pt5 ...)。
4  b2 b3 对比,有交点的,选择距离短的加入到b4中。无交点的加入到b4中。将b4 =b2 再循环计算

步骤3  4依次进行到最后一个点为止。

根据b2 生成所有的线。

点的数量越多,计算花费的时间越长。 如果再加设定距离对比值,计算时间可以相对短点。

点评

感谢提供思路,这个思路比较绕,等我再理解理解  发表于 2015-8-26 09:02
发表于 2015-8-25 16:25:25 | 显示全部楼层
是做网架么
这样的问题
用犀牛直接就搞定了

点评

感谢提供信息,我查查看,以前没有用过犀牛,最新版本是5.0简体中文版么?  发表于 2015-8-26 09:06
没错,是做网架的,平面规则网架比较好整,有现成的模板,我在做一个三维立体非标网架的建模辅助插件  发表于 2015-8-26 09:03
发表于 2015-8-26 10:16:17 | 显示全部楼层
犀牛里面有很多插件,可以直接划分三维网格,结合其三维投影等强大的三维功能,是为做网架之必备神器

点评

谢谢了,刚看了你的回复,找了犀牛试手,上手有点慢,能不能上传个最简单的操作流程,我好照猫画虎  发表于 2015-8-26 15:09
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-26 15:10 , Processed in 0.185307 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表