明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8243|回复: 33

求闭合多段线的心【不是一般的心】(望高手出手)感激不尽(已解决)

    [复制链接]
发表于 2012-12-11 19:55 | 显示全部楼层 |阅读模式
本帖最后由 yanguangfei 于 2012-12-15 18:11 编辑


不能用 GetBoundingBox
求得的点一定要在多边形内尽量靠中间
接近中心就行多边形复杂时求出的结果不能出封闭多线
能提供算法或加密独立函数也行
源码最好
再次先谢
;;;求型心坐标
;;;(defun GetCoord (ename)
;;;    (COmmand "mapcreatecentroids" "s" ename "" "")
;;;    (setq pts (Vlax-Get (Vlax-Ename->Vla-Object (setq delpt (entlast))) 'Coordinates ))
;;;    (entdel delpt)
;;;  pts
;;;)

这个命令是AUTO Map 3D 自带的一个命令 反复调用会错误

改后的程序
虽然不是很理想但凑合了
感谢所有关注的人





;;;测试函数
(defun c:tt ( / ss s)
    (setq ss (ssget '((0 . "*poLyline")))
   S 0)
    (if ss
      (repeat (sslength ss)
  (command "point" (Get_center (ssname ss s)))
  (setq s (1+ s))
      )
   )
)
;;;测试函数
(defun c:test ()
   (while T
      (command "point" (Get_center(car(entsel))))
   )
)

;;;求多边形内相对中心点[V 1.0]
;;;  by yanguangfei
(defun Get_center (ename /  Pts   2R Mk  Mkline points DelLine
     i lst N Newlst   DistList   R   Number   Pt)
    (setq Pts     (GetBoundingBox ename)
   2R      (MJ:MIDPOINT (CAR Pts) (CADR Pts))
   Mk      (entmake (list (cons 0 "LINE")(cons 10 (polar 2R 0.0 300))(cons 11 (polar 2R 3.14159 300))))
   Mkline  (entlast)
   points  (vlax-invoke (vlax-ename->vla-object ename) 'IntersectWith (vlax-ename->vla-object Mkline) acExtendOtherEntity)
   DelLine (entdel Mkline)
   i       0
   lst     nil
   )
  (repeat (/ (length points) 3)
       (setq lst (append lst (list (list (nth i points) (nth (1+ i) points) (nth (+ 2 i) points)))))
       (setq i (+ i 3))
  )
  (setq lst (px lst))
  (if (>= (length lst) 4)
      (progn
   (setq N      0
  Newlst nil)
   (repeat (/ (length lst) 2)
       (setq Newlst (append Newlst (list (list (nth N lst) (nth (1+ N) lst)))))
       (setq N (+ 2 N))
   )
   (setq DistList nil
         R        0)
   (repeat (length Newlst)
     (setq Number (nth R Newlst)
           DistList (append DistList  (list(distance (car Number) (cadr Number)))))
     (setq R (1+ R))
   )
   (setq  Pt (nth (vl-position (car (vl-sort DistList '>)) DistList) Newlst))
(MJ:MIDPOINT (car pt) (cadr pt));返回值
      )
      (MJ:MIDPOINT (car lst) (cadr lst));返回值
  )
)
(defun MJ:MIDPOINT (P1 P2)
  (mapcar '(lambda (X Y) (/ (+ X Y) 2.0)) P1 P2)
)
(defun GetBoundingBox (ent / ll ur)
    (vla-getboundingbox (vlax-ename->vla-object ent) 'll 'ur)
    (mapcar 'vlax-safearray->list (list ll ur))
)
(defun px (X)
    (vl-sort  X
             (function (lambda (e1 e2)
                         (< (car e1) (car e2)) ) ) )
)


本帖子中包含更多资源

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

x
发表于 2017-11-23 21:40 | 显示全部楼层

  1. ;; tt(闭合曲线内部点)
  2. (defun c:tt ()
  3.   (xyp-Start)
  4.   (setq i -1)
  5.   (if (setq ss (ssget '((0 . "*POLYLINE"))))
  6.     (while (setq s1 (ssname ss (setq i (1+ i))))
  7.       (xyp-point (xyp-PtInCurve s1 nil))
  8.     )
  9.   )
  10.   (xyp-End)
  11. )

本帖子中包含更多资源

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

x
发表于 2018-6-22 14:06 | 显示全部楼层
质心的话,不一定是在多段线内的啊,如果两头面积很大,中间通过一个小廊连接的话,质心会在多段线外面的,
发表于 2016-9-23 01:34 | 显示全部楼层
chpmould 发表于 2012-12-13 19:46
不知这个要求用在什么行业

测绘,整体中心,线内
发表于 2012-12-11 21:49 来自手机 | 显示全部楼层
明天发给你一段代码,是G版给我的,现在手机上的不方便
发表于 2012-12-11 22:35 | 显示全部楼层
利用ActiveX,由多以线生成面域,再利用(vla-get-centroid regobj) 即可得到质心啊

点评

多边形复杂时,点还是跑到了外面,看我发的DWG你试试  发表于 2012-12-11 23:05
发表于 2012-12-11 22:37 | 显示全部楼层
本帖最后由 highflybir 于 2012-12-11 22:41 编辑

多边形的形心(质心)不一定在多边形内部。

点评

那那个心在内部就要那个心  发表于 2012-12-11 23:06
发表于 2012-12-11 23:02 | 显示全部楼层
附件内的fas文件只包含函数get_centroid (仅对封闭多以线有效),你可以封装在你的文件内
测试代码如下:
  1. (vl-load-com)
  2. (defun c:test (/ ent res)
  3.   (if (not (setq ent (car (entsel))))
  4.     (exit)
  5.     (progn
  6.       (setq res (get_centroid ent))
  7.       (princ res)
  8.     )
  9.   )
  10.   (princ)
  11. )
正如‘飞得更高’所说,形心不一定在内部

本帖子中包含更多资源

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

x

点评

那还是没意义,和 GetBoundingBox 取中点一样,那叫什么心?有发球部  发表于 2012-12-11 23:13
 楼主| 发表于 2012-12-11 23:03 | 显示全部楼层
xiabin68 发表于 2012-12-11 21:49
明天发给你一段代码,是G版给我的,现在手机上的不方便

先谢过 嘿嘿
发表于 2012-12-11 23:13 | 显示全部楼层
形心已出,详细附件

BTW: Autocad计算的质心很准确的,因为工作的原因经常用到ansys , 比较过
两者计算的一模一样

本帖子中包含更多资源

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

x
发表于 2012-12-11 23:19 | 显示全部楼层
那我就不知道了,只有等高手解决

本帖子中包含更多资源

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

x
 楼主| 发表于 2012-12-11 23:53 | 显示全部楼层
本帖最后由 yanguangfei 于 2012-12-11 23:56 编辑


测试结果 还是跑外面了
sunny20102

本帖子中包含更多资源

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

x
发表于 2012-12-11 23:56 | 显示全部楼层
你的那个心没有什么一定的标准,很模糊,仅仅满足在内部和尽量接近就行了的话,这样的点有很多个。
而且你提供的样例图中的那些中心没有一个是质心的,即使是不复杂的多边形也不是质心。
所以建议楼主能更明确要求。

点评

AuTo Map 3D就说创建质心 看我发的第一个 GIF 接近中心就行多边形复杂时求出的结果不能出封闭多线 那你给来个 先谢  发表于 2012-12-12 00:01
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 16:09 , Processed in 1.072159 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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