[Відмова від відповідальності: Я думаю, що наступне має працювати, але насправді не кодував це сам]
Я не міг придумати "тривіальний" метод отримання відповіді "так / ні", але наступне було б розумним підходом до практичного вирішення питання.
Припустимо, наші криві A (s) і B (t) з контрольними точками { A0, A1..An } і { B0, .. Bm } відповідно.
Мені здається, що, зважаючи на пару 2D Beziers, для яких ми хочемо визначити, чи не перетинаються, слід розглянути шість випадків:
Випадок, коли ми можемо «тривіально» визначити, вони не перетинаються.
Випадок, коли вони перетинаються скінченну кількість разів, і ми можемо "легко" визначити, що вони напевно перетинаються хоча б один раз (але насправді нас не цікавить, де ці перехрестя відбуваються)
Один з Безьє є виродженим, тобто точкою (яка відбудеться, якщо всі контрольні точки однакові). Можна припустити, що ми вже розглядали випадок, коли обидва є очками.
Одна або кілька кривих закриті, наприклад. A0 == An. Щоб полегшити життя, ми поділимо такі криві і почнемо заново.
Існує нескінченна кількість точок перетину, оскільки кожна є підмножиною "батьківського" Безьє, і вони перетинаються.
Ми не впевнені у вищезазначених випадках і потребуємо подальшого розслідування
На даний момент ми проігноруємо 3 і 4, але повернемося до них пізніше.
Випадок 1
Як ви натякаєте у своєму запитанні, якщо відповідні обмежувальні поля контрольних точок A і B ) не перетинаються, криві не можуть перетинатися. Очевидно, це швидкий тест на відхилення, але він надто консервативний. Як ви, напевно, знаєте, при кривій Безьє опуклий корпус його контрольних точок утворює (більш жорсткий) зв'язаний на кривій. Таким чином, ми можемо використовувати техніку роздільної осі, щоб вирішити, чи не перетинаються корпуси A і B. (наприклад, як показано у Вікіпедії :)
Випадок 2
Якщо випробування 1-го випадку не вдалося, ви можете перевірити наявність "тривіального" перехрестя. Зараз, мабуть, є кращі способи зробити це, але мені прийшов наступний порівняно дешевий підхід:
Розглянемо просто криву A:
Ми знаємо, що крива починається з А0, закінчується в Ан, і буде лежати всередині опуклого корпусу. Для простоти обчислимо напрямок відрізка лініїА0Ан¯¯¯¯¯¯¯¯¯¯¯¯ і обчислити межі з обох сторін (тобто візьміть крапки добутку решти контрольних точок проти перпендикуляра до А0Ан¯¯¯¯¯¯¯¯¯¯¯¯).
Якщо ми зробимо те саме з кривою B, отримаємо такий (можливий) випадок:
Якщо ми знайдемо А0 і Анзнаходяться поза протилежними межами B і тогоБ0 і Бм знаходяться на стороні меж А, тоді, за безперервністю Безьє, повинно бути хоча б одне перехрестя.
Справа 6
Якщо ми не можемо одразу показати жоден із перерахованих вище випадків, то розділимо кожного з Безьє на дві "половинки", тобто А1,А2,Б1,Б2. Це досить просто (залишається читачем як вправа), але особливо тривіально для квадратичних Безьє :
Рекурсивно порівнюйте 4 комбінації: (А1,Б1) , (А2,Б1) . . . (А2,Б2). Зрозуміло, що якщо всі проходять справа 1, то перетину немає. Якщо якась помилка 1, продовжуйте решту тестів із зменшеним набором.
Випадок 3 та 5
Це стає дещо більш виснажливим.
Якщо "випадок 3" проходить тест "випадок 1", мені здається, що вам потрібно вирішити фактичне перехрестя. З огляду на те, що існує простий процес для зіставлення N контрольних точок Безьє, A (s), до N-1 точок Безьє, A '(s), що представляють його 1-е похідне, тоді (за умови догляду за відносно рідкісні, так звані "вироджені" ситуації, коли 1-я похідна робить нульову), тоді ітерація Ньютона (за одним виміром) може бути використана для пошуку потенційних рішень.
Зауважимо також, що, оскільки контрольні точки A '(s) пов'язані з похідними значеннями, існує можливість зробити раннє усунення деяких випадків.
Випадок 5 здається порівняно малоймовірним, тому, можливо, лише якщо після декількох рекурсій не існує переконливих доказів, можна спробувати кожну кінцеву точку А проти кривої В і навпаки. Це дало б лише доказ перетину, а не доказ неперетину.