|
143 | 143 | [(n . = . 2) (list (line data (first vs) (second vs)))] |
144 | 144 | [else (list (lines data vs))])) |
145 | 145 | vss))) |
146 | | - |
| 146 | + |
147 | 147 | (define-values (vss1 vss2) (split-lines3d vs plane)) |
148 | 148 | (values (vertices->lines vss2) (vertices->lines vss1))])) |
149 | 149 |
|
|
254 | 254 | (define n (length ivls)) |
255 | 255 | (define-values (ivls1 ivls2) (split-at ivls (quotient n 2))) |
256 | 256 | (interval-list-union (loop ivls1) (loop ivls2))]))) |
257 | | - |
| 257 | + |
258 | 258 | (cond [(empty? ivls) #f] |
259 | 259 | [(empty? (rest ivls)) #f] |
260 | 260 | [else |
|
408 | 408 | (match s |
409 | 409 | [(points _ vs) |
410 | 410 | (if (empty? vs) empty (list s))] |
411 | | - [(line _ v1 v2) |
| 411 | + [(line _ v1 v2) |
412 | 412 | (if (equal? v1 v2) empty (list s))] |
413 | 413 | [(poly data vs ls norm) |
414 | 414 | (let-values ([(vs ls) (canonical-polygon3d vs ls)]) |
|
513 | 513 | [else |
514 | 514 | (define axes (vertices->axes (bsp-polys->vertices ps))) |
515 | 515 | (define center (list->flvector (map axis-mid axes))) |
516 | | - |
| 516 | + |
517 | 517 | ;; Planes defined by neighboring polygon vertices |
518 | 518 | (define polygon-planes (delay (sort-planes (append* (map bsp-poly-planes ps)) center))) |
519 | | - |
| 519 | + |
520 | 520 | (: try-bsp-split/polygon-planes (-> Boolean (U #f BSP-Tree))) |
521 | 521 | ;; Tries splitting using polygon-planes |
522 | 522 | (define (try-bsp-split/polygon-planes disjoint?) |
523 | 523 | (define planes (force polygon-planes)) |
524 | 524 | (cond [(and disjoint? ((length planes) . > . 10)) #f] |
525 | 525 | [else (try-bsp-split/planes ss planes disjoint?)])) |
526 | | - |
| 526 | + |
527 | 527 | (let* ([bsp #f] |
528 | 528 | [bsp (if bsp bsp (try-bsp-split/axial-planes ss axes))] |
529 | 529 | [bsp (if bsp bsp (try-bsp-split/bounding-planes ss ps center))] |
|
543 | 543 | [else |
544 | 544 | (define axes (vertices->axes (bsp-lines->vertices ls))) |
545 | 545 | (define center (list->flvector (map axis-mid axes))) |
546 | | - |
| 546 | + |
547 | 547 | ;; Planes defined by line segments and basis vectors (i.e. one basis in normal is zero) |
548 | 548 | (define line-planes (delay (sort-planes (append* (map bsp-line-planes ls)) center))) |
549 | | - |
| 549 | + |
550 | 550 | (: try-bsp-split/line-planes (-> Boolean (U #f BSP-Tree))) |
551 | 551 | ;; Tries splitting using line-planes |
552 | 552 | (define (try-bsp-split/line-planes disjoint?) |
553 | 553 | (define planes (force line-planes)) |
554 | 554 | (cond [(and disjoint? ((length planes) . > . 10)) #f] |
555 | 555 | [else (try-bsp-split/planes ss planes disjoint?)])) |
556 | | - |
| 556 | + |
557 | 557 | (let* ([bsp #f] |
558 | 558 | [bsp (if bsp bsp (try-bsp-split/axial-planes ss axes))] |
559 | 559 | [bsp (if bsp bsp (try-bsp-split/line-planes #t))] |
|
573 | 573 | (define axes (vertices->axes (append (append* (map lines-vertices ls)) |
574 | 574 | (append* (map points-vertices ps))))) |
575 | 575 | (define center (list->flvector (map axis-mid axes))) |
576 | | - |
| 576 | + |
577 | 577 | (: try-nondisjoint-split (-> (U #f BSP-Tree))) |
578 | 578 | (define (try-nondisjoint-split) |
579 | 579 | (match-define (axis i size _mn _mx mid) (argmax axis-size axes)) |
580 | 580 | (cond [(size . < . 0.01) #f] |
581 | 581 | [else |
582 | 582 | (define plane (axial-plane i mid)) |
583 | 583 | (try-bsp-split ss plane #f (λ () #f))])) |
584 | | - |
| 584 | + |
585 | 585 | (let* ([bsp #f] |
586 | 586 | [bsp (if bsp bsp (try-bsp-split/axial-planes ss axes))] |
587 | 587 | [bsp (if bsp bsp (try-nondisjoint-split))]) |
|
0 commit comments