Come si calcola se 2 linee sono rivolte verso o lontano?


10

Dati i 4 punti che descrivono 2 segmenti di linea, come si calcola se la linea A è verso o lontano dalla linea B?

Le 2 linee hanno una lunghezza fissa e possono essere misurate come distanza da x1 / y1 a x2 / y2.

inserisci qui la descrizione dell'immagine


In che modo il caso con la curva di Bezier è diverso dal caso con linee rette? Hai una curva che potrebbe racchiudere completamente l'altra linea (in modo che ogni direzione indichi "verso")?
Bummzack,

1
Probabilmente dovrai chiarire i termini. In Geometria, una "linea" si estende all'infinito in entrambe le direzioni, al contrario di una semiretta o di un segmento, quindi 2 linee si incrociano sempre a meno che non siano parallele. Di quale stai chiedendo? Hai disegnato una freccia, che implica una direzione, che per me implica un segmento o al massimo una mezza linea. E qual è la tua definizione di "verso" e "via"?
Hackworth,

La curva di Bezier potrebbe essere più difficile da rappresentare nell'uguaglianza richiesta per risolvere un test di intersezione raggio-linea. A proposito, cambierei la parola che rappresenta la tua freccia in "raggio". Potresti ottenere una risposta più rapida. Risponderò a questa domanda se avrò tempo a pranzo se nessun altro lo farà. In caso contrario, questo è un compito estremamente comune nei giochi. Google "Test di intersezione del segmento di linea Ray". Sospetto che il test della curva di Bezier sia simile, ma non l'ho mai provato.
Brandon,

3
Dovresti dividere la domanda in due. La parte con segmenti di linea è molto semplice. La parte con curve di Bezier è estremamente complessa e ha solo una soluzione numerica approssimativa.
Sam Hocevar,

Ho diviso la mia domanda in 2, come richiesto. La seconda parte è qui: gamedev.stackexchange.com/questions/21463/…
Robinicks,

Risposte:


11

Lasciare Ae Bessere due punti sulla linea nera. Lascia Cche Dsia il tuo segmento blu. Il segno della zcoordinata del prodotto incrociato AB^ACindica se Cè "sinistra" o "destra" della linea nera. Allo stesso modo, il prodotto incrociato AB^CDti dice se CDdirige "a sinistra" o "a destra" della linea nera.

Non vogliamo davvero sapere se è sinistra o destra; tutto ciò che vogliamo è assicurarci che siano nella stessa direzione o nella direzione opposta, ecco perché moltiplichiamo i due valori.

Il seguente pseudocodice dovrebbe pertanto funzionare:

z1 = (xB-xA)*(yC-yA) - (yB-yA)*(xC-xA);
z2 = (xB-xA)*(yD-yC) - (yB-yA)*(xD-xC);
z3 = z1 * z2;

if (z3 < 0)
    ; /* Pointing towards (BUT maybe even crossing) */
else if (z3 > 0 || z2 != 0)
    ; /* Pointing away */
else
    ; /* Parallel */

Temo di aver bisogno di un po 'di tempo per scrivere una soluzione adeguata per la curva di Bezier. La seguente situazione è verso o lontano?

Problema?


Per la curva, credo che potresti trovare la tangente della curva nel punto più vicino al tuo segmento di linea e utilizzarla nello stesso modo in cui testi gli altri segmenti di linea. Probabilmente un po 'più difficile di quanto sembri :)
notlesh

@stephelton: guarda di nuovo la seconda immagine per le curve di Bezier, che punta verso una curva che curva via. Oppure considera una curva con un parallelo tangente al segmento eventualmente intersecante, ma che curva verso il segmento e si interseca.
Cascabel,

+1 per il trollface e buona matematica :). Tuttavia, il diagramma "verso" in realtà ha ancora un "assente": basta spostare il punto iniziale sopra la linea.
Jonathan Dickinson,

@JonathanDickinson grazie, ho aggiornato l'immagine per rendere leggermente più chiaro quale sia il mio interrogatorio!
Sam Hocevar,

2

Supponendo che il punto iniziale sia il cerchio verde e il punto finale sia la freccia rossa

Calcola la distanza tra il punto iniziale come DS e il segmento nero e fai lo stesso per il punto finale (freccia rossa) come DE. Se DS> DE, il segmento punta verso. se DE> DS, punta lontano. Se entrambi sono uguali, i due sono paralleli.

È possibile trovare il modo di calcolare la distanza da un punto ad un segmento qui , e per una curva di Bézier quadratica qui . Tuttavia, a seconda della forma della curva di Bezier, potrebbe restituire risultati strani (la curva può incrociarsi)


DS> DE è garantito per funzionare solo per linee rette. Può fallire per Beziers. Inoltre, non conosci la sua definizione di "verso". Se l'estensione della freccia attraversa una linea definita da 2 punti, ma non il segmento definito dagli stessi punti, è ancora "verso"?
Hackworth,

Sto parlando di due segmenti, non di linee, quindi non c'è "estensione della freccia". Inoltre, non importa dove punta la freccia, poiché qui stiamo parlando di distanze. Il punto più vicino sulla linea nera potrebbe essere un punto iniziale / finale della linea nera, non importa. I due segmenti potrebbero essere collineari, questo metodo funzionerebbe ancora come previsto. Per le curve di Bezier ho detto che darebbe strani risultati a seconda della forma della curva.
Ravachol,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.