Manipulação de Polígonos

;| subrotina auxiliar, calcula a área de um polígono 
  fechado, mas sem dividir por 2, nem retirar o sinal
Obs: pts é a lista de corrdenadas, ex: 
((x1 y1) ... (xn yn)) |;

(defun ia_proclpt  (pts)
  (
setq pts (append pts (list (car pts))))
  (
- (apply
       '+
       (mapcar
         '*
         (mapcar 'car pts)
         (
cdr (mapcar 'cadr pts))))
     (
apply
       '+
       (mapcar
         '*
         (mapcar 'cadr pts)
         (
cdr (mapcar 'car pts))))))


;|retorna true para poligonos
horientados no sentido horário

e false para anti-horário |;

(defun isclockwise  (pts)
  (
< (ia_proclpt pts) 0))


;|calcula a área de um polígon
o por triangulação|;

(defun getarealpt  (pts)
  (
/ (abs (ia_proclpt pts)) 2))


;calcula o centroide de um polígono
(defun get-centroid  (pts / x y qtd sf n
                      p1 p2 x1 x2 y1 y2 area
)
  (
setq qtd  (length pts)
        area (/ (ia_proclpt pts) 2)
        pts  (append pts (list (car pts)))
        x    0
        y    0
        n    0)
  (
repeat qtd
    (setq p1 (nth n pts)
          n  (1+ n)
          p2 (nth n pts)
          x1 (car p1)
          x2 (car p2)
          y2 (cadr p2)
          y1 (cadr p1)
          sf (- (* x1 y2) (* x2 y1))
          x  (+ x (* (+ x1 x2) sf))
          y  (+ y (* (+ y1 y2) sf))))
  (
list (/ x (* 6 area))
        (
/ y (* 6 area))))

Nenhum comentário:

Postar um comentário