Una soluzione è dividere il poligono concavo in segmenti convessi, quindi utilizzare il collegamento cobbal.
Dal momento che in realtà hai due diversi problemi fondamentali, hai considerato altre alternative al problema del hit test, ad esempio l'utilizzo di un albero BSP? Puoi accelerare ulteriormente posizionando una griglia sul poligono e costruendo un albero BSP per ogni quadrato della griglia. O un albero kd con al massimo un bordo in ogni foglia?
Edit: io ellaborate sul kd-tree (per noia, anche se potrebbe essere di qualche utilità a nessuno):
kd-alberi hanno le seguenti proprietà:
- Sono binari
- Ogni nodo non fogliare divide lo spazio lungo un piano perpendicolare a un asse, un lato per bambino. Per esempio. la radice divide lo spazio in x < x0 e x> = x0
- I livelli degli alberi, a turno, si dividono lungo diversi assi, ad es. livello 0 (root) divide perpendicolare a X, Livello 1 -> Y, ecc
Per utilizzare questo per il poligono hit rilevamento, costruire l'albero come segue:
- selezionamento un vertice per dividere lungo. (Preferibilmente da qualche parte vicino al centro per un albero equilibrato).
- Dividi altri vertici in due gruppi, uno per ciascun lato della divisione. Il vertice sopra non va in nessuno dei due set.
- Posizionare i bordi anche nei set. Qualsiasi arco che interseca la linea divisa va in entrambi i gruppi.
- Costruire i bambini in modo ricorsivo dai gruppi precedenti.
Se il vertice diviso viene scelto in modo appropriato, l'albero deve avere profondità vicino al log (N), dove N è il numero di vertici. Ogni nodo foglia avrà al massimo un bordo che lo attraversa. Per eseguire il rilevamento dei colpi:
- Trova la foglia in cui cade il punto.
- Se c'è un bordo nella foglia, confrontare il punto ad esso. In caso contrario, dovrebbe essere ovvio se il punto è all'interno o all'esterno (conservare queste informazioni in tali foglie quando si costruisce l'albero).
Considerate un test "Punto in poligono" pesante? Il più delle volte è solo un test "più grande di" e/o "meno di" di tutti i punti di cui è composto il poligono, e solo in alcuni casi un test di intersezione delle linee? O...? –
Non sei sicuro di cosa intendi ... Sto usando il test di incrocio dispari per una semiretta (dopo aver controllato il rettangolo di delimitazione, ovviamente). Questo finisce per testare un sacco di lati, e se il poligono ha molti lati è piuttosto lento. –
Coud si collega ad alcuni set di dati, questo suona come qualcosa che potrebbe essere divertente da provare. –