;; | ---------------------------------------------------------------------------- ;; | ---------------------------------------------------------------------------- ;; | Determine centroid of a polygon ;; | ;; | Algorithm: ;; | 1. Form trapezoids by dropping lines from each segment to a basey axis. ;; | 2. Calculate the area and CG of the triangle and rectangle in each trapezoid ;; | 3. Sums up weighted moments against given axes in X and Y direction ;; | (may use x and y axes if number is small) ;; | 4. Derived CG by dividing weighted sum by total area. ;; | e-mail : rakesh.rao@4d-technologies.com ;; | Web : www.4d-technologies.com ;; | ---------------------------------------------------------------------------- (defun GE_centroid(vlist / segno n ttl_area basex basey p1 p2 x1 x2 y1 y2 t_x t_y t_area t_xm t_ym r_x r_y r_area r_xm r_ym Mx My) (setq vlist (append vlist (list (car vlist))) segno (1- (length vlist)) ; no of segments n 0 Ttl_Area 0.0 ; total area Mx 0.0 ; Sum of moment to basex line My 0.0 ; Sum of moment to basey line basex (car (nth 0 vlist)) ; arbitrary axes (will reduce error for large numbers) basey (cadr (nth 0 vlist)) ) (repeat segno (setq p1 (nth n vlist) ; process current segment p2 (nth (1+ n) vlist) x1 (car p1) y1 (cadr p1) x2 (car p2) y2 (cadr p2) ; For the triangle t_x (- (* (+ x2 x2 x1) 0.333333) basex) ; cg of trianlge t_y (- (* (+ y1 y1 y2) 0.333333) basey) t_area (* (- y2 y1) (- x2 x1) 0.5) ; area of triangle t_xm (* t_area t_x) ; moment to Basex t_ym (* t_area t_y) ; moment to basey ; For the rectangle r_x (- (/ (+ x1 x2) 2) basex) ; CG of rectangle r_y (- (/ (+ basey y1) 2) basey) r_area (* (- x2 x1) (- y1 basey)) ; area of rectangle r_xm (* r_area r_x) ; moment to basex r_ym (* r_area r_y) ; moment to basey Ttl_Area (+ Ttl_Area t_area r_area) Mx (+ Mx t_xm r_xm) ; adds up moments to basex My (+ My t_ym r_ym) ; adds up moments to basey n (1+ n) ) ) (list (+ (/ Mx Ttl_Area) basex) (+ (/ My Ttl_Area) basey) 0.0) )