Skip to content

Commit be177f3

Browse files
committed
[irtgeo.l] fix triangulation
1 parent 0f6abd3 commit be177f3

File tree

1 file changed

+24
-2
lines changed

1 file changed

+24
-2
lines changed

irteus/irtgeo.l

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,9 @@
393393

394394
;; return polygon if triangable ,unless return nil.
395395
;; this function = sharpp + trianglable + insidep
396+
;; input face should be simple. see
397+
;; Make Simple function in Triangulatio by Ear Clipping by David Eberly
398+
;; http://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf
396399
(defun face-to-tessel-triangle (f num &optional (*epsilon* 1e-10))
397400
"return polygon if triangable, return nil if it is not."
398401
#-(or :x86_64 :aarch64)
@@ -425,11 +428,13 @@
425428
(or (null r)
426429
(eq r :parallel)
427430
(eq r :outside)
431+
(and (consp r)
432+
(eq (car r) :colinear))
428433
(and (consp r)
429434
(eq (car r) :intersect)
430435
(not (eps-in-range 0.0 (elt r 1) 1.0 (- *epsilon*)))
431436
(not (eps-in-range 0.0 (elt r 2) 1.0 (- *epsilon*)))))))
432-
(send (instance face :init :vertices (butlast rvers)) :edges))
437+
(send (instance face :init :vertices (remove v1 (cdr vers))) :edges))
433438
t)))
434439
(if not-intersectp
435440
poly
@@ -468,7 +473,24 @@
468473
(car v) (cdr v))))
469474
(when (and (<= 0.0 (car p) 1.0)
470475
(< 0.0 (cadr p) 1.0))
471-
(list e))))
476+
(list e))
477+
(when (and (< 0.0 (car p) 1.0)
478+
(or (= 0.0 (cadr p)) (= 1.0 (cadr p))))
479+
nil) ;; not implemented yet
480+
;; duplicated vertices exist
481+
(when (and (or (= 0.0 (car p)) (= 1.0 (car p)))
482+
(or (= 0.0 (cadr p)) (= 1.0 (cadr p)))
483+
(not (or (memq (car v) (send e :vertices)) (memq (cdr v) (send e :vertices)))))
484+
(let* ((ev (if (= 0.0 (car p)) (e . pvert) (e . nvert)))
485+
(ein (find-if #'(lambda (e) (eq ev (e . nvert))) (flatten (append (send-all hs :edges) (send f :edges)))))
486+
(eout (find-if #'(lambda (e) (eq ev (e . pvert))) (flatten (append (send-all hs :edges) (send f :edges)))))
487+
(v0 (eout . nvert))
488+
(v1 (if (= 0.0 (cadr p)) (cdr v) (car v)))
489+
(v2 (ein . pvert)))
490+
(when (< (mod (+ (vector-angle (v- v0 ev) (v- v1 ev) (send f :normal)) 2PI) 2PI)
491+
(mod (+ (vector-angle (v- v0 ev) (v- v2 ev) (send f :normal)) 2PI) 2PI))
492+
(list e))))
493+
))
472494
(flatten (append (send-all hs :edges) (send f :edges)))))
473495
(unless r
474496
;; r is mutually visible vertices

0 commit comments

Comments
 (0)