[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) và 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:
Trường hợp chúng ta có thể "tầm thường" xác định chúng không giao nhau.
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)
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.
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.
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.
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 A và B ), 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 A và B không giao nhau. (ví dụ như được hiển thị trong Wikipedia :)
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:
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ể):
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.