|
393 | 393 |
|
394 | 394 | ;; return polygon if triangable ,unless return nil. |
395 | 395 | ;; 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 |
396 | 399 | (defun face-to-tessel-triangle (f num &optional (*epsilon* 1e-10)) |
397 | 400 | "return polygon if triangable, return nil if it is not." |
398 | 401 | #-(or :x86_64 :aarch64) |
|
425 | 428 | (or (null r) |
426 | 429 | (eq r :parallel) |
427 | 430 | (eq r :outside) |
| 431 | + (and (consp r) |
| 432 | + (eq (car r) :colinear)) |
428 | 433 | (and (consp r) |
429 | 434 | (eq (car r) :intersect) |
430 | 435 | (not (eps-in-range 0.0 (elt r 1) 1.0 (- *epsilon*))) |
431 | 436 | (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)) |
433 | 438 | t))) |
434 | 439 | (if not-intersectp |
435 | 440 | poly |
|
468 | 473 | (car v) (cdr v)))) |
469 | 474 | (when (and (<= 0.0 (car p) 1.0) |
470 | 475 | (< 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 | + )) |
472 | 494 | (flatten (append (send-all hs :edges) (send f :edges))))) |
473 | 495 | (unless r |
474 | 496 | ;; r is mutually visible vertices |
|
0 commit comments