找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 684|回复: 10

[研讨] 如何找到起始端

[复制链接]

已领礼包: 1883个

财富等级: 堆金积玉

发表于 2020-1-11 13:10:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 aimisiyou 于 2020-1-12 10:07 编辑

一根细长的矩形条,经过多次90度弯折后如图(弯折过程中宽度可能变大或变小),如何找到起始端?(即已知所有点的坐标,求起始端,令顺时针方向的最终端点为起始段,即图中的P6P7)。图中我是以最左最低点为0号点,顺时针排序点号。
111.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2020-1-11 13:53:28 | 显示全部楼层
本帖最后由 aimisiyou 于 2020-1-11 13:55 编辑

似乎分两种情况:
1、离0点最近的点是1的话,则01是起始段;
2、若离0点最近的点不是点1的话,则取中间的两个点为起始段。比如离0点最近的点是点5,则点2点3是起始段;离0点最近的点是点13,则点6点7是起始段;离0点最近的点是点15,则点7点8是起始段.
222.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2020-1-11 14:58:01 | 显示全部楼层
本帖最后由 aimisiyou 于 2020-1-11 14:59 编辑

先将所有点按X从小到大(若同一X值按Y值从小到大排序),两两配对连线(此时连的都是纵向线),然后按类似链表顺序查找方式,找到该点X方向最近的点并连接(此时连的都是横向线)。
444.png
555.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2020-1-11 16:46:55 | 显示全部楼层
_$ (defun fp ()
    (setq sn (ssget ":N" '((0 . "point"))))
    (setq i 0 n (sslength sn) plst nil)
    (while (< i n)
        (setq plst (cons (cons (+ i 1) (cdr (assoc 10 (entget (ssname sn i))))) plst))
        (setq i (+ i 1))
    )
   (reverse plst)
)
FP
_$ (fp)
((1 6247.32 2372.02 0.0) (2 6383.84 2372.02 0.0) (3 6383.84 2435.83 0.0) (4 6249.82 2435.83 0.0) (5 6249.82 2656.05 0.0) (6 6425.22 2656.05 0.0) (7 6425.22 2528.33 0.0) (8 6325.2 2528.33 0.0) (9 6325.2 2556.91 0.0) (10 6383.84 2556.91 0.0) (11 6383.84 2603.49 0.0) (12 6286.21 2603.49 0.0) (13 6286.21 2461.31 0.0) (14 6425.22 2461.31 0.0) (15 6425.22 2316.93 0.0) (16 6280.69 2316.93 0.0) (17 6573.05 2135.07 0.0) (18 6573.05 2088.78 0.0) (19 6280.69 2135.07 0.0) (20 6247.32 2088.78 0.0))
_$
_$ (setq pts (vl-sort (fp) '(lambda (ea eb) (if (equal (cadr ea) (cadr eb)) (< (caddr ea) (caddr eb))  (< (cadr ea) (cadr eb))))))
((20 6247.32 2088.78 0.0) (1 6247.32 2372.02 0.0) (4 6249.82 2435.83 0.0) (5 6249.82 2656.05 0.0) (19 6280.69 2135.07 0.0) (16 6280.69 2316.93 0.0) (13 6286.21 2461.31 0.0) (12 6286.21 2603.49 0.0) (8 6325.2 2528.33 0.0) (9 6325.2 2556.91 0.0) (2 6383.84 2372.02 0.0) (3 6383.84 2435.83 0.0) (10 6383.84 2556.91 0.0) (11 6383.84 2603.49 0.0) (15 6425.22 2316.93 0.0) (14 6425.22 2461.31 0.0) (7 6425.22 2528.33 0.0) (6 6425.22 2656.05 0.0) (18 6573.05 2088.78 0.0) (17 6573.05 2135.07 0.0))
_$
_$
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5295个

财富等级: 富甲天下

发表于 2020-1-11 17:00:46 | 显示全部楼层
取第一个点的坐标就可以了。

点评

你没理解题意。  详情 回复 发表于 2020-1-11 18:56
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2020-1-11 18:56:55 | 显示全部楼层
tzfcn 发表于 2020-1-11 17:00
取第一个点的坐标就可以了。

你没理解题意。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2020-1-11 18:59:54 | 显示全部楼层
本帖最后由 aimisiyou 于 2020-1-11 19:00 编辑

(defun fp ()
    (setq sn (ssget ":N" '((0 . "point"))))
    (setq i 0 n (sslength sn) plst nil)
    (while (< i n)
        (setq plst (cons (cons (+ i 1) (cdr (assoc 10 (entget (ssname sn i))))) plst))
        (setq i (+ i 1))
    )
   (reverse plst)
)
(setq pts (vl-sort (fp) '(lambda (ea eb) (if (equal (cadr ea) (cadr eb)) (< (caddr ea) (caddr eb))  (< (cadr ea) (cadr eb))))))
(setq i 0 n (length pts) pt (car pts) ptlst nil)
(while (< i n)
  (setq ptlst (cons (list i (cadr pt) (caddr pt) (cadddr pt)) ptlst))
  (setq pts (vl-remove nil (mapcar '(lambda (x) (if (equal pt x) nil x)) pts)))
  (if (= (rem i 2) 0)
      (setq pt (car (vl-sort (vl-remove nil (mapcar '(lambda (x) (if (equal (cadr pt) (cadr x) 0.00001) x nil)) pts)) '(lambda (ea eb) (< (distance (cdr ea) (cdr pt)) (distance (cdr eb) (cdr pt)))))))
      (setq pt (car (vl-sort (vl-remove nil (mapcar '(lambda (x) (if (equal (caddr pt) (caddr x) 0.00001) x nil)) pts)) '(lambda (ea eb) (< (distance (cdr ea) (cdr pt)) (distance (cdr eb) (cdr pt)))))))
  )
  (setq i (+ i 1))
)
(setq ptlst (reverse ptlst))
(mapcar '(lambda (x y) (command "line" (cdr x) (cdr y) "")) ptlst (append (cdr ptlst) (list (car ptlst))))



_$ ptlst
((0 10743.4 -681.248 0.0) (1 10743.4 550.705 0.0) (2 11584.4 550.705 0.0) (3 11584.4 -387.435 0.0) (4 11078.7 -387.435 0.0) (5 11078.7 318.747 0.0) (6 11367.7 318.747 0.0) (7 11367.7 231.118 0.0) (8 11151.0 231.118 0.0) (9 11151.0 -299.807 0.0) (10 11496.7 -299.807 0.0) (11 11496.7 463.076 0.0) (12 10815.6 463.076 0.0) (13 10815.6 -573.002 0.0) (14 11847.5 -573.002 0.0) (15 11847.5 -63.4282 0.0) (16 12058.3 -63.4282 0.0) (17 12058.3 93.5983 0.0) (18 12139.5 93.5983 0.0) (19 12139.5 -128.856 0.0) (20 11909.0 -128.856 0.0) (21 11909.0 -681.248 0.0))
_$

666.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2020-1-11 22:11:06 | 显示全部楼层
本帖最后由 aimisiyou 于 2020-1-11 22:12 编辑

为了保证虽然多选了一些干扰点,但仍能得出正确结果。代码稍作修改。
(defun fp ()
    (setq sn (ssget ":N" '((0 . "point"))))
    (setq i 0 n (sslength sn) plst nil)
    (while (< i n)
        (setq plst (cons (cons (+ i 1) (cdr (assoc 10 (entget (ssname sn i))))) plst))
        (setq i (+ i 1))
    )
   (reverse plst)
)
(setq pts (vl-sort (fp) '(lambda (ea eb) (if (equal (cadr ea) (cadr eb)) (< (caddr ea) (caddr eb))  (< (cadr ea) (cadr eb))))))
(setq i 0 n (length pts) pt (car pts) ptlst nil flag t)
(while (and flag (< i n))
  (setq ptlst (cons (list i (cadr pt) (caddr pt) (cadddr pt)) ptlst))
  (setq pts (vl-remove nil (mapcar '(lambda (x) (if (equal pt x) nil x)) pts)))
  (if (= (rem i 2) 0)
      (setq pt (car (vl-sort (vl-remove nil (mapcar '(lambda (x) (if (equal (cadr pt) (cadr x) 0.00001) x nil)) pts)) '(lambda (ea eb) (< (distance (cdr ea) (cdr pt)) (distance (cdr eb) (cdr pt)))))))
      (setq pt (car (vl-sort (vl-remove nil (mapcar '(lambda (x) (if (equal (caddr pt) (caddr x) 0.00001) x nil)) pts)) '(lambda (ea eb) (< (distance (cdr ea) (cdr pt)) (distance (cdr eb) (cdr pt)))))))
  )
  (if pt
     (setq i (+ i 1))
         (setq flag  nil)
  )
)
(setq ptlst (reverse ptlst))
(mapcar '(lambda (x y) (command "line" (cdr x) (cdr y) "")) ptlst (append (cdr ptlst) (list (car ptlst))))
777.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2020-1-11 22:18:13 | 显示全部楼层
有时加入了一些干扰点,得出的结果不正确,要进行修正。如图。若连续的四个点构成矩形,且四点是按顺时针方向,且四点内无其他点,则删除该四点,并调整点的序号,得到正确的图形。
888.png
999.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2020-1-11 23:11:42 | 显示全部楼层
最后就是标注了。采用缩回的方法,从末端标注较长的线段,如点10、点11的距离长于点13、点12,故标注点10、11;将点11、12缩回与点13平齐,点13调整为点13’(纵坐标不变,横坐标同点11),此时点14点13’距离大于点9点10距离,故标注点14点13’;将点10点13’缩回与点9对齐,点9调整为点9’(横坐标不变,纵坐标同点13’),此时点15点14距离大于点8点9’距离,故标注点15点14;……
000.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2020-2-17 15:30:21 | 显示全部楼层
本帖最后由 aimisiyou 于 2020-2-17 16:08 编辑

缩回的办法似乎有些复杂,可以从末端点通过判断连续三点是顺时针还是逆时针就可以得出要标注的两点。如上图,9,10,11顺时针方向,所以标注10,11两点;8,9,10是逆时针,所以标注10,14两点。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-22 10:26 , Processed in 0.471286 second(s), 52 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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