yanguangfei 发表于 2012-12-11 19:55:48

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

本帖最后由 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))))
   )
)

;;;求多边形内相对中心点
;;;by yanguangfei
(defun Get_center (ename /Pts   2R MkMkline 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))
   )
   (setqPt (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-sortX
             (function (lambda (e1 e2)
                         (< (car e1) (car e2)) ) ) )
)


xyp1964 发表于 2017-11-23 21:40:23


;; tt(闭合曲线内部点)
(defun c:tt ()
(xyp-Start)
(setq i -1)
(if (setq ss (ssget '((0 . "*POLYLINE"))))
    (while (setq s1 (ssname ss (setq i (1+ i))))
      (xyp-point (xyp-PtInCurve s1 nil))
    )
)
(xyp-End)
)

evayleung 发表于 2018-6-22 14:06:20

质心的话,不一定是在多段线内的啊,如果两头面积很大,中间通过一个小廊连接的话,质心会在多段线外面的,

wkq004 发表于 2016-9-23 01:34:00

chpmould 发表于 2012-12-13 19:46
不知这个要求用在什么行业

测绘,整体中心,线内

xiabin68 发表于 2012-12-11 21:49:50

明天发给你一段代码,是G版给我的,现在手机上的不方便

sunny20102 发表于 2012-12-11 22:35:36

利用ActiveX,由多以线生成面域,再利用(vla-get-centroid regobj) 即可得到质心啊

highflybir 发表于 2012-12-11 22:37:08

本帖最后由 highflybir 于 2012-12-11 22:41 编辑

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

sunny20102 发表于 2012-12-11 23:02:03

附件内的fas文件只包含函数get_centroid (仅对封闭多以线有效),你可以封装在你的文件内
测试代码如下:(vl-load-com)
(defun c:test (/ ent res)
(if (not (setq ent (car (entsel))))
    (exit)
    (progn
      (setq res (get_centroid ent))
      (princ res)
    )
)
(princ)
)正如‘飞得更高’所说,形心不一定在内部

yanguangfei 发表于 2012-12-11 23:03:22

xiabin68 发表于 2012-12-11 21:49 static/image/common/back.gif
明天发给你一段代码,是G版给我的,现在手机上的不方便

先谢过 嘿嘿

sunny20102 发表于 2012-12-11 23:13:43

形心已出,详细附件

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

sunny20102 发表于 2012-12-11 23:19:36

那我就不知道了,只有等高手解决

yanguangfei 发表于 2012-12-11 23:53:18

本帖最后由 yanguangfei 于 2012-12-11 23:56 编辑


测试结果 还是跑外面了
sunny20102

highflybir 发表于 2012-12-11 23:56:04

你的那个心没有什么一定的标准,很模糊,仅仅满足在内部和尽量接近就行了的话,这样的点有很多个。
而且你提供的样例图中的那些中心没有一个是质心的,即使是不复杂的多边形也不是质心。
所以建议楼主能更明确要求。
页: [1] 2 3 4
查看完整版本: 求闭合多段线的心【不是一般的心】(望高手出手)感激不尽(已解决)