Polygon Centroid

See also Geometric Functions

Function Syntax (LM:PolyCentroid <e>)
Current Version 1.1
Arguments
Symbol Type Description
e EName LWPolyline Entity
Returns
Type Description
List Centroid of LWPolyline Polygon expressed in WCS

Function Description

This function will return the centroid (expressed relative to WCS) of an LWPolyline Polygon, that is, a non-self-intersecting closed LWPolyline with straight segments.

Since this function uses only coordinate manipulation to calculate the position of the centroid, it will consequently evaluate much faster than the common equivalent method of creating a temporary Region Object and extracting the Centroid property (since the creation of a Region requires the loading of various Modelling DLLs).

Select all
;; Polygon Centroid  -  Lee Mac
;; Returns the WCS Centroid of an LWPolyline Polygon Entity

(defun LM:PolyCentroid ( e / l )
    (foreach x (setq e (entget e))
        (if (= 10 (car x)) (setq l (cons (cdr x) l)))
    )
    (
        (lambda ( a )
            (if (not (equal 0.0 a 1e-8))
                (trans
                    (mapcar '/
                        (apply 'mapcar
                            (cons '+
                                (mapcar
                                    (function
                                        (lambda ( a b )
                                            (
                                                (lambda ( m )
                                                    (mapcar
                                                        (function
                                                            (lambda ( c d ) (* (+ c d) m))
                                                        )
                                                        a b
                                                    )
                                                )
                                                (- (* (car a) (cadr b)) (* (car b) (cadr a)))
                                            )
                                        )
                                    )
                                    l (cons (last l) l)
                                )
                            )
                        )
                        (list a a)
                    )
                    (cdr (assoc 210 e)) 0
                )
            )
        )
        (* 3.0
            (apply '+
                (mapcar
                    (function
                        (lambda ( a b )
                            (- (* (car a) (cadr b)) (* (car b) (cadr a)))
                        )
                    )
                    l (cons (last l) l)
                )
            )
        )
    )
)

Test Program

This short and simple program will prompt the user to select a closed LWPolyline composed entirely of straight segments, and will proceed to create a Point Entity at the centroid of the selected LWPolyline.

PolyCentroid
Select all
(defun c:test ( / ss )
    (if
        (setq ss
            (ssget "_+.:E:S:L"
               '(
                    (0 . "LWPOLYLINE")
                    (-4 . "&=")
                    (70 . 1)
                    (-4 . "<NOT")
                    (-4 . "<>")
                    (42 . 0.0)
                    (-4 . "NOT>")
                )
            )
        )
        (entmake (list '(0 . "POINT") (cons 10 (LM:PolyCentroid (ssname ss 0)))))
    )
    (princ)
)

See also Geometric Functions

textsize

increase · reset · decrease

Designed & Created by Lee Mac © 2010