[Dichiarazione di non responsabilità: penso che quanto segue dovrebbe funzionare ma in realtà non l'ho codificato da solo]
Non riuscivo a pensare a un metodo "banale" per produrre una risposta sì / no, ma il seguente sarebbe un approccio ragionevole a una soluzione pratica alla domanda.
Supponiamo che le nostre curve siano A (s) e B (t) con punti di controllo { A0, A1..An } e { B0, .. Bm } rispettivamente.
Mi sembra che, dato un paio di Bezier 2D per i quali desideriamo determinare se fare o non intersecare, ci sono sei casi da considerare:
Caso in cui possiamo "banalmente" determinare che non si intersecano.
Caso in cui si intersecano un numero finito di volte e possiamo "facilmente" determinare che si intersecano sicuramente almeno una volta (ma in realtà non ci interessa dove si verificano tali incroci)
Uno dei Bezier è degenerato, cioè un punto (che si verificherà se tutti i punti di controllo sono identici). Possiamo presumere che abbiamo già gestito il caso in cui entrambi sono punti.
Una o più curve sono chiuse, ad es. A0 == An. Per semplificare la vita, suddivideremo tali curve e ricominceremo.
Esiste un numero infinito di punti di intersezione perché ognuno è un sottoinsieme di un "parent" Bezier e si sovrappongono.
Non siamo sicuri dei casi di cui sopra e abbiamo bisogno di ulteriori indagini
Per il momento ignoreremo 3 e 4, ma torneremo da loro più tardi.
Caso 1
Come suggerisci nella tua domanda, se le rispettive caselle di delimitazione dei punti di controllo di A e B ), non si intersecano, le curve non possono intersecarsi. Ovviamente questo è un test di rifiuto rapido ma è eccessivamente conservativo. Come probabilmente saprai, con una curva di Bezier, lo scafo convesso dei suoi punti di controllo forma un limite (più stretto) sulla curva. Possiamo quindi usare la tecnica dell'asse di separazione per decidere se gli scafi di A e B non si intersecano. (ad es. come mostrato in Wikipedia :)
Caso 2
Se il test del caso 1 fallisce, è possibile verificare l'esistenza "banale" di un incrocio. Ora ci sono probabilmente modi migliori per farlo, ma mi è venuto in mente il seguente approccio, relativamente economico:
Considera solo la curva A:
Sappiamo che la curva inizia da , termina da e si troverà all'interno dello scafo convesso. Per semplicità, calcoliamo la direzione del segmento di linea e calcoliamo i limiti su entrambi i lati (ovvero prendiamo i prodotti punto dei punti di controllo rimanenti rispetto alla perpendicolare a ).A n ¯ A 0 A n ¯ A 0 A nA0AnA0An¯¯¯¯¯¯¯¯¯¯¯¯A0An¯¯¯¯¯¯¯¯¯¯¯¯
Se facciamo lo stesso con la curva B, otteniamo il seguente (possibile) caso:
Se troviamo e sono fuori dai limiti opposti di B e che e sono le parti esterne dei limiti di A, quindi, dalla continuità di Béziers, ci deve essere almeno un'intersezione.A n B 0 B mA0AnB0Bm
Caso 6
Se non riusciamo a mostrare immediatamente nessuno dei casi precedenti, dividi ciascuno dei Bezier in due "metà", ovvero . Questo è relativamente semplice (lasciato come esercizio al lettore) ma è particolarmente banale per Beziers quadratico :A1,A2,B1,B2
Confronta ricorsivamente le 4 combinazioni: . Chiaramente se tutto passa il caso 1, non c'è intersezione. In caso di esito negativo 1, continuare con il resto dei test con quel sottoinsieme ridotto.(A1,B1),(A2,B1)...(A2,B2)
Casi 3 e 5
È qui che diventa leggermente più noioso.
Se "caso 3" supera il test "caso 1", mi sembra che devi risolvere per un vero incrocio. Dato che esiste un semplice processo per mappare i punti di controllo N di un Bezier, A (s), ai punti N-1 di Bezier, A '(s), che rappresenta il suo primo derivato quindi (a condizione che si prenda cura del relativamente rare, le cosiddette situazioni "degenerate" in cui la prima derivata fa zero), quindi l'iterazione di Newton (su una dimensione) potrebbe essere utilizzata per trovare potenziali soluzioni.
Si noti inoltre che, poiché i punti di controllo di A '(s) sono legati ai valori derivati, esiste la possibilità di eliminare anticipatamente alcuni casi.
Il caso 5 sembra relativamente improbabile, quindi forse solo se dopo alcune ricorsioni non ci sono prove conclusive, si potrebbe provare ogni punto finale di A contro la curva B e viceversa. Ciò darebbe solo una prova dell'intersezione, non una prova della non intersezione.