|
471 | 471 | (mapcan #'(lambda (e) |
472 | 472 | (let ((p (geo::line-intersection3 (e . pvert) (e . nvert) |
473 | 473 | (car v) (cdr v)))) |
474 | | - (cond ((and (<= 0.0 (car p) 1.0) |
| 474 | + (cond ;; intersects with an edge. not mutually visible. |
| 475 | + ((and (<= 0.0 (car p) 1.0) |
475 | 476 | (< 0.0 (cadr p) 1.0)) |
476 | 477 | (list e)) |
| 478 | + ;; vertex is on an edge. never happen? |
477 | 479 | ((and (< 0.0 (car p) 1.0) |
478 | 480 | (or (= 0.0 (cadr p)) (= 1.0 (cadr p)))) |
479 | 481 | nil) ;; not implemented yet |
480 | | - ;; vertex is shared by more than two edges. avoid intersecting. |
| 482 | + ;; multiple vertices exist at the same position. avoid crossing. See https://github.com/euslisp/jskeus/pull/585#issuecomment-709988453 |
481 | 483 | ((and (or (= 0.0 (car p)) (= 1.0 (car p))) |
482 | 484 | (or (= 0.0 (cadr p)) (= 1.0 (cadr p))) |
483 | 485 | (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))) |
| 486 | + ;; v0, v1, v2: consecutive vertices in f or h. v1 is at the same position as one of v, but not the same object. |
| 487 | + ;; vt: another point of v |
| 488 | + ;; If located clockwise around v1 in the order of v2 vt v0, crossing will occur. |
| 489 | + (let* ((v1 (if (= 0.0 (car p)) (e . pvert) (e . nvert))) |
485 | 490 | (ein (find-if #'(lambda (e) (eq ev (e . nvert))) (flatten (append (send-all hs :edges) (send f :edges))))) |
| 491 | + (v0 (ein . pvert)) |
486 | 492 | (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)) |
| 493 | + (v2 (eout . nvert)) |
| 494 | + (vt (if (= 0.0 (cadr p)) (cdr v) (car v)))) |
| 495 | + (when (< (mod (+ (vector-angle (v- v2 v1) (v- vt v1) (send f :normal)) 2PI) 2PI) |
| 496 | + (mod (+ (vector-angle (v- v2 v1) (v- v0 v1) (send f :normal)) 2PI) 2PI)) |
492 | 497 | (list e))))) |
493 | 498 | )) |
494 | 499 | (flatten (append (send-all hs :edges) (send f :edges))))) |
|
0 commit comments