|
471 | 471 | (mapcan #'(lambda (e) |
472 | 472 | (let ((p (geo::line-intersection3 (e . pvert) (e . nvert) |
473 | 473 | (car v) (cdr v)))) |
474 | | - (when (and (<= 0.0 (car p) 1.0) |
475 | | - (< 0.0 (cadr p) 1.0)) |
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)))) |
| 474 | + (cond ((and (<= 0.0 (car p) 1.0) |
| 475 | + (< 0.0 (cadr p) 1.0)) |
| 476 | + (list e)) |
| 477 | + ((and (< 0.0 (car p) 1.0) |
| 478 | + (or (= 0.0 (cadr p)) (= 1.0 (cadr p)))) |
| 479 | + nil) ;; not implemented yet |
| 480 | + ;; vertex is shared by more than two edges. avoid intersecting. |
| 481 | + ((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 | 493 | )) |
494 | 494 | (flatten (append (send-all hs :edges) (send f :edges))))) |
495 | 495 | (unless r |
|
0 commit comments