Kent
Your function is OK, with correct results, but there must be a purely mathematical solution.
Beside the solution in my last post, here is an alternative:
(defun average_angle (lst / u)
(setq u (car lst)
lst (mapcar
'(lambda (a)
(if
(and
(equal (sin a) (sin u) 1)
(equal (cos a) (cos u) 1)
)
a
(rem (+ a pi) (* 2 pi))
)
)
lst
)
)
(/ (apply '+ lst) (length lst))
)
And here is a test function
(defun c:test ( / m2p ss i n e p1 p2 a l u p)
(defun m2p (a b) (mapcar '(lambda (a b) (/ (+ a b) 2.0)) a b))
(if
(setq ss (ssget '((0 . "LINE"))))
(progn
(repeat (setq i (sslength ss) n i)
(setq i (1- i)
e (entget (ssname ss i))
p1 (cdr (assoc 10 e))
p2 (cdr (assoc 11 e))
a (cons (angle p1 p2) a)
l (cons (m2p p1 p2) l)
)
)
(setq a (average_angle a)
u (list (cos a) (sin a) 0.0)
p (mapcar '/ (apply 'mapcar (cons '+ l)) (list n n n))
)
(entmakex
(list
'(0 . "XLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbXline")
(cons 10 p)
(cons 11 u)
)
)
)
)
(princ)
)