Kiểm tra đáng tin cậy cho giao điểm của hai đường cong Bezier


9

Làm thế nào để tìm ra liệu hai đường cong Bezier phẳng có giao nhau không? Bằng cách "đáng tin cậy", ý tôi là bài kiểm tra sẽ chỉ trả lời "có" khi các đường cong giao nhau và "không" chỉ khi chúng không giao nhau. Tôi không cần biết thông số giao lộ được tìm thấy tại. Tôi cũng muốn sử dụng các số dấu phẩy động trong việc thực hiện.

Tôi đã tìm thấy một số câu trả lời trên StackOverflow sử dụng các hộp giới hạn của các đường cong cho thử nghiệm: đây không phải là những gì tôi sau khi thử nghiệm như vậy có thể báo cáo giao lộ ngay cả khi các đường cong không giao nhau.

Thứ gần nhất tôi tìm thấy cho đến nay là " cái nêm giới hạn " của Sederberg và Meyers nhưng nó "chỉ" phân biệt giữa giao điểm nhiều nhất và hai hoặc nhiều hơn, trong khi tôi muốn biết liệu có nhiều nhất không và một hoặc nhiều giao điểm.


Tôi không chắc nó tồn tại như vậy, việc xác định wetehr hoặc có khả năng 0-1 hoặc 2 trở lên là khá nhỏ nhưng công thức không thực sự khiến nó chắc chắn là 0 hoặc 1 mà không thực sự kiểm tra.
joojaa

Các yêu cầu thời gian chạy là gì? Một giải pháp có thể tạo ra kết quả khá chính xác sẽ là xấp xỉ cả hai đường cong bằng một số lượng lớn các đoạn thẳng ngắn và sau đó cắt chúng theo kiểu cặp đôi. Nhưng điều đó tốn nhiều thời gian và bộ nhớ.
Dragonseel

@Dragonseel Vâng, tôi sẽ rất vui vì bất kỳ giải pháp nào, thực sự, nhưng vì bạn đã hỏi O (1) sẽ rất tuyệt. Nhưng việc xấp xỉ các đường cong với các đoạn đường dẫn đến các vấn đề tương tự như thử nghiệm cho chồng chéo hộp ...
Ecir Hana

Vấn đề thú vị. Tôi không nghĩ rằng có một câu trả lời dễ dàng nhưng tôi muốn sai. Bạn có một liên kết cho bài viết của Sederberg và Meyers không?
Daniel M G Tàu

@DanielMGessel Có, xem chỉnh sửa ở trên.
Ecir Hana

Câu trả lời:


6

Một cách khác để hình thành vấn đề là xác định hàm cho khoảng cách giữa các điểm trên hai đường cong, như là một hàm của các tham số của đường cong. Sau đó cố gắng tìm mức tối thiểu toàn cầu của chức năng này. Nếu các đường cong giao nhau, tối thiểu sẽ bằng không; nếu không thì tối thiểu sẽ là một khoảng cách tích cực.

c1,c2:[0,1]R2

f(u,v):[0,1]2R0|c2(v)c1(u)|2

f


[0,1]2R2

1
[0,1]R2

1
xyxciy

@Nathan: Tôi đã xem xét điều đó nhưng, đã dành nhiều thời gian để viết mã để tìm cực tiểu ở các định dạng nén kết cấu, tất cả có vẻ hơi ghê tởm.
Simon F

5

[Tuyên bố miễn trừ trách nhiệm: Tôi nghĩ rằng những điều sau đây sẽ hoạt động nhưng bản thân nó không thực sự được mã hóa]

Tôi không thể nghĩ ra một phương pháp "tầm thường" để đưa ra câu trả lời có / không nhưng sau đây sẽ là một cách tiếp cận hợp lý cho một giải pháp thực tế cho câu hỏi.

Giả sử đường cong của chúng ta là A (s)B (t) với các điểm kiểm soát { A0, A1..An } và { B0, .. Bm }.

Dường như với tôi, với một cặp Beziers 2D mà chúng tôi muốn xác định làm hoặc không giao nhau, có sáu trường hợp cần xem xét:

  1. Trường hợp chúng ta có thể "tầm thường" xác định chúng không giao nhau.

  2. Trường hợp chúng giao nhau một số lần hữu hạn và chúng ta có thể "dễ dàng" xác định chúng chắc chắn giao nhau ít nhất một lần (nhưng chúng ta thực sự không quan tâm đến những giao lộ đó xảy ra ở đâu)

  3. Một trong những Beziers bị suy biến, tức là một điểm (sẽ xảy ra nếu tất cả các điểm kiểm soát giống hệt nhau). Chúng tôi có thể giả định rằng chúng tôi đã xử lý trường hợp cả hai đều là điểm.

  4. Một hoặc nhiều đường cong được đóng lại, vd. A0 == An. Để làm cho cuộc sống đơn giản hơn, chúng ta sẽ chia nhỏ các đường cong như vậy và bắt đầu lại.

  5. Có vô số điểm giao nhau vì mỗi điểm là tập con của Bezier "cha mẹ" và chúng trùng nhau.

  6. Chúng tôi không chắc chắn về các trường hợp trên và cần điều tra thêm

Hiện tại, chúng tôi sẽ bỏ qua 3 và 4, nhưng hãy quay lại với họ sau.

Trường hợp 1

Khi bạn gợi ý trong câu hỏi của mình, nếu các hộp giới hạn tương ứng của các điểm kiểm soát của AB ), không giao nhau, thì các đường cong không thể giao nhau. Rõ ràng đây là một thử nghiệm từ chối nhanh chóng nhưng nó quá bảo thủ. Như bạn có thể biết, với đường cong Bezier, vỏ lồi của các điểm kiểm soát của nó tạo thành một (chặt chẽ hơn) bị ràng buộc trên đường cong. Do đó, chúng ta có thể sử dụng kỹ thuật trục tách để quyết định xem vỏ của AB không giao nhau. (ví dụ như được hiển thị trong Wikipedia :)

nhập mô tả hình ảnh ở đây

Trường hợp 2

Nếu thử nghiệm trường hợp 1 thất bại, thì bạn có thể kiểm tra sự tồn tại "tầm thường" của giao lộ. Bây giờ có lẽ có nhiều cách tốt hơn để làm điều này, nhưng cách tiếp cận sau đây, tương đối rẻ, đã xảy ra với tôi:

Chỉ xem xét đường cong A:

Giới hạn "đường béo" của Bezier

A0AnA0An¯A0An¯

Nếu chúng ta làm tương tự với đường cong B, chúng ta sẽ gặp trường hợp sau (có thể): nhập mô tả hình ảnh ở đây

A0AnB0Bm

Trường hợp 6

A1,A2,B1,B2

(A1,B1),(A2,B1)...(A2,B2)

Trường hợp 3 & 5

Đây là nơi nó trở nên hơi tẻ nhạt hơn.

Nếu "trường hợp 3" vượt qua bài kiểm tra "trường hợp 1", thì đối với tôi, bạn cần phải giải quyết một giao lộ thực tế. Cho rằng có một quy trình đơn giản để ánh xạ các điểm kiểm soát N của Bezier, A (s), đến các điểm N-1 của Bezier, A '(s), đại diện cho đạo hàm 1 của nó sau đó (được chăm sóc cẩn thận tương đối hiếm, được gọi là tình huống "suy biến" trong đó đạo hàm 1 không bằng 0), sau đó phép lặp Newton (trên một chiều) có thể được sử dụng để tìm giải pháp tiềm năng.
Cũng lưu ý rằng, vì các điểm kiểm soát của A '(s) bị ràng buộc với các giá trị đạo hàm, nên có khả năng loại bỏ sớm một số trường hợp.

Trường hợp 5 dường như tương đối khó xảy ra, vì vậy có lẽ chỉ sau một vài lần thu hồi không có bằng chứng thuyết phục, người ta có thể thử từng điểm cuối của A so với đường cong B và ngược lại. Điều này sẽ chỉ đưa ra một bằng chứng về giao lộ - không phải là bằng chứng về không giao nhau.


Có, nhưng cá nhân tôi quan tâm nhiều hơn đến trường hợp về trường hợp Bm và / hoặc B0 đều nằm trong khối lượng giới hạn tối đa và tối thiểu của A nhưng không đâm thủng nó thì bạn cần phải chia nhỏ và trong trường hợp xấu nhất là tính toán giao điểm điểm. Cách tốt hơn là sử dụng hộp giới hạn tối thiểu còn được gọi là xấp xỉ đường dày.
joojaa

Cho rằng, với mỗi phân chia nhị phân, sự khác biệt giữa đường cong và phân đoạn kết nối các điểm cuối giảm theo yếu tố hợp lý (và, trên đỉnh đầu của tôi, tôi nghĩ rằng nó có thể là 4x cho tứ giác) chắc chắn các giới hạn đang diễn ra để hội tụ đến một dải băng "mỏng" khá nhanh.
Simon F

Có nhưng trường hợp xấu nhất là bezier khác bắt đầu ở cái khác.
joojaa

Ý bạn là, ví dụ, An == B0 . Bạn có xác định đó là một giao lộ hay không?
Simon F

Không giống như B0 ở đâu đó trên đường cong. Hoặc thậm chí chỉ là giao nhau tối thiểu
joojaa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.