乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 34|回复: 9

[编程交流] 开放多边形的重心

[复制链接]

19

主题

70

帖子

51

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
95
发表于 2022-7-6 08:35:03 | 显示全部楼层 |阅读模式
有人有嘴唇可以定位开放多段线的线的重心吗?
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-6 08:45:45 | 显示全部楼层
如果pline没有圆弧,这应该可以工作
  1. (defun c:cgpline (/ dst lst mdp mdx mdy ss x y en pt)
  2. (if
  3.    (setq ss (ssget ":E:S:L" '((0 . "LWPOLYLINE"))))
  4.     (progn
  5.       (setq lst (mapcar 'cdr
  6.                         (vl-remove-if
  7.                           '(lambda (x) (/= (car x) 10))
  8.                           (setq en (entget (ssname ss 0)))
  9.                         )
  10.                 )
  11.             dst (mapcar 'distance lst (cdr lst))
  12.             mdp (mapcar '(lambda (x y)
  13.                            (mapcar '(lambda (a b) (* 0.5 (+ a b))) x y)
  14.                          )
  15.                         lst
  16.                         (cdr lst)
  17.                 )
  18.             mdx (mapcar 'car mdp)
  19.             mdy (mapcar 'cadr mdp)
  20.             x   (/ (apply '+ (mapcar '* mdx dst)) (apply '+ dst))
  21.             y   (/ (apply '+ (mapcar '* mdy dst)) (apply '+ dst))
  22.             pt  (trans (list x
  23.                              y
  24.                              (cond ((cdr (assoc 38 en)))
  25.                                    (0.0)
  26.                              )
  27.                        )
  28.                        (trans '(0. 0. 1.) (cdr (assoc 210 en)) 0 T)
  29.                        0
  30.                 )
  31.       )
  32.       (entmake (list '(0 . "POINT") (cons 10 pt)))
  33.     )
  34. )
  35. (princ)
  36. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:51:30 | 显示全部楼层
http://www.theswamp.org/index.php?topic=18725.0
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-6 08:55:52 | 显示全部楼层
@斯特凡。我认为你的程序没有给正确的中心点一条折线。
 
我的版本。。。。使用窗口选择集,这意味着一次关闭可以选择多少。
 
  1. (defun c:TesT (/ pl i sn e lst pts n i x y)
  2. ;;; Tharwat 12. Dec. 2011 ;;
  3. (if (setq pl (ssget '((0 . "*POLYLINE"))))
  4.    (repeat (setq i (sslength pl))
  5.      (setq sn (ssname pl (setq i (1- i))))
  6.      (setq e (entget sn))
  7.      (setq lst (vl-remove-if-not
  8.                  (function (lambda (x)
  9.                              (if (eq (car x) 10)
  10.                                (setq pts (cons (list (cadr x) (caddr x)) pts))
  11.                              )
  12.                            )
  13.                  )
  14.                  e
  15.                )
  16.      )
  17.      (setq i 0 x 0 y 0 )
  18.      (repeat (setq n (length pts))
  19.        (setq x (+ (car (nth i pts)) x))
  20.        (setq y (+ (cadr (nth i pts)) y))
  21.        (setq i (1+ i))
  22.      )
  23.      (entmake (list '(0 . "POINT") (cons 10 (list (/ x (length pts)) (/ y (length pts))))))
  24.    )
  25.    (princ)
  26. )
  27. (princ)
  28. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:06:00 | 显示全部楼层
骗子的方式:
 
Tharwat,我看不出有什么意义:
 
  1. (setq lst (vl-remove-if-not
  2.            (function (lambda (x)
  3.                        (if (eq (car x) 10)
  4.                          (setq pts (cons (list (cadr x) (caddr x)) pts))
  5.                        )
  6.                      )
  7.            )
  8.            e
  9.          )
  10. )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-6 09:08:38 | 显示全部楼层
 
我确信你知道每一段代码,如果你指出两个变量的名字,实际上我只想得到没有前10个变量的坐标。
 
顺便问一下,你看到这个请求了吗?
 
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:16:27 | 显示全部楼层
 
我的意思是,使用vl remove if not函数是多余的,因为您没有使用返回的列表(变量“lst”)。
 
请考虑以下内容:
 
  1. (foreach pair (entget <entity>)
  2.    (if (= 10 (car pair))
  3.        (setq pts (cons (cdr pair) pts))
  4.    )
  5. )
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-6 09:21:48 | 显示全部楼层
我认为OP想要轮廓的重心,像一条非常非常细的线。。。
 
我可能错了,那么我的观点确实算错了。
在Lee给出的链接中,Evgeniy给出了三种计算重心的方法:
1) 对于一个区域
2) 对于大纲
3) 对于集中在节点中的质量
 
我的计算重心与第二个一样。
 
另一方面,我试过你的Lisp程序和李的。。。结果不同。。。
 
编辑:Tharwat,您的例程是计算顶点位置的媒体,而不是重心。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-6 09:31:20 | 显示全部楼层
 
是的,除此之外,我们还可以在相同的情况下使用mapcar函数。
 
  1. (mapcar
  2.        (function
  3.          (lambda (x)
  4.            (if (eq (car x) 10)
  5.              (setq pts (cons (list (cadr x) (caddr x)) pts))
  6.            )
  7.          )
  8.        )
  9.        e
  10.      )

 
非常感谢。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:35:34 | 显示全部楼层
我上面的代码是返回质心,Tharwat只是平均我认为只适用于正多边形和三角形的点。
 
以下是返回LWPolyline多边形质心的另一种方法:
 
  1. 6

 
以上返回的结果与我之前的代码(使用区域)相同,与链接线程中的gile代码相同,用于LWPolyline多边形(即具有直线段的非自交LWPolyline)。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-9 09:02 , Processed in 0.882956 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表