Coordinate punti
Salve, scusandomi in anticipo in caso la sezione fosse errata e ringraziandovi per le eventuali risposte, pongo la mia domanda.
Sto sviluppando una applicazione 2D in java, ho uno sfondo (detto playfield) che gestisco come se fosse un piano cartesiano le cui coordinate del vertice in alto a sinistra sono 0,0 (x,y) e quelle in basso a destra determinano la dimensione del playfield (es 800,600). Sul playfield ci sono il punto A ed il punto B con coordinate note e fisse. Io devo posizionere n oggetti di tipo C tra il punto A ed il punto B.
Il punto A nell'applicazione è il vertice alto ( o basso ma questo non è un problema) di una porta di calcio, il punto B rappresenta la palla, e simulando una punizione dal limite gli oggetti C sono i giocatori che compongono la barriera .... Spero che non odiate il calcio, comunque il problema non ha niente a che vedere con questo sport! I dati di cui sono in possesso sono : dimensioni del playfield, la posizione di A nel playfield, la posizione di B, la distanza tra A e B, la distanza tra B ed il primo dei punti C sulla retta che unisce A con B ed infine la distanza tra i punti C sulla loro retta. Devo creare una classe Java che mi tiri fuori le coordinate degli oggetti di tipo C. Non voglio il codice, ci mancherebbe, ma siccome non sono un cima in queste cose, vorrei solo delle dritte su come risolvere il problema e poi magari continuare la discussione sempre qui proponendo io stesso il codice.
Faccio un disegno per farvi capire al meglio la cosa, nella mia ignoranza totale immaginavo di iniziare da una retta perpendicolare a quella che unisce A con B, ma sinceramente mi sono arenato
Sto sviluppando una applicazione 2D in java, ho uno sfondo (detto playfield) che gestisco come se fosse un piano cartesiano le cui coordinate del vertice in alto a sinistra sono 0,0 (x,y) e quelle in basso a destra determinano la dimensione del playfield (es 800,600). Sul playfield ci sono il punto A ed il punto B con coordinate note e fisse. Io devo posizionere n oggetti di tipo C tra il punto A ed il punto B.
Il punto A nell'applicazione è il vertice alto ( o basso ma questo non è un problema) di una porta di calcio, il punto B rappresenta la palla, e simulando una punizione dal limite gli oggetti C sono i giocatori che compongono la barriera .... Spero che non odiate il calcio, comunque il problema non ha niente a che vedere con questo sport! I dati di cui sono in possesso sono : dimensioni del playfield, la posizione di A nel playfield, la posizione di B, la distanza tra A e B, la distanza tra B ed il primo dei punti C sulla retta che unisce A con B ed infine la distanza tra i punti C sulla loro retta. Devo creare una classe Java che mi tiri fuori le coordinate degli oggetti di tipo C. Non voglio il codice, ci mancherebbe, ma siccome non sono un cima in queste cose, vorrei solo delle dritte su come risolvere il problema e poi magari continuare la discussione sempre qui proponendo io stesso il codice.
Faccio un disegno per farvi capire al meglio la cosa, nella mia ignoranza totale immaginavo di iniziare da una retta perpendicolare a quella che unisce A con B, ma sinceramente mi sono arenato


Risposte
Ciao, la tua idea mi sembra corretta! Dati i tuoi punti A e B il coefficiente angolare della retta che li congiunge si trova con $$m_{AB} = \frac{y_B - y_A}{x_B - x_A}$$ Poi esiste un teorema secondo il quale il coefficiente angolare della perpendicolare a questa retta è $$m' = -\frac{1}{m_{AB}} = \frac{x_A - x_B}{y_B - y_A}$$ Infine la retta che cerchi è la perpendicolare passante per un punto, nel tuo caso C (che hai detto di conoscere). Questa retta, in base ad un'altra formula, sarà $$y - y_C = m'(x-x_C) \Rightarrow y - y_C = \frac{x_A - x_B}{y_B - y_A}(x - x_C).$$

Grazie tantissime, erano proprio le formule che mi mancavano. Se può servire a qualcuno ho usato questa classe Java per trovare il punto di intersezione che non è altro che l'algoritmo di Bresenham modificato di cui si possono trovare info qui http://tech-algorithm.com/articles/drawing-line-using-bresenham-algorithm/
dDistance è la 'distanza della barriera' e cioè quella che ci deve essere tra il punto di intersezione e B, Ho usato >= poichè trattasi infine di un'animazione 2D per cui un differenza di 1 pixel non è significativa graficamente. spPuntoMobile è uno 'sprite' cioè un oggettino da 1 pixel che sposto sulla retta di punto in punto. GetX e getDistance sono metodi dell'oggetto sprite, con il secondo determino la distanza tra due sprite nel playfield. Diciamo che simulo 'i passi' che fa l'arbitro partendo dal pallone per determinare la distanza della barriera.
Ora mi accingo a fare il resto, grazie ancora per la splendida risposta!
a presto, Aliberto
private double[] PuntoIntersezioneRetta (int x,int y,int x2, int y2, double dDistance) { double [] dCoordIntersezione = null; int w = x2 - x ; int h = y2 - y ; int dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0 ; if (w<0) dx1 = -1 ; else if (w>0) dx1 = 1 ; if (h<0) dy1 = -1 ; else if (h>0) dy1 = 1 ; if (w<0) dx2 = -1 ; else if (w>0) dx2 = 1 ; int longest = Math.abs(w) ; int shortest = Math.abs(h) ; if (!(longest>shortest)) { longest = Math.abs(h) ; shortest = Math.abs(w) ; if (h<0) dy2 = -1 ; else if (h>0) dy2 = 1 ; dx2 = 0 ; } int numerator = longest >> 1 ; for (int i=0;i<=longest;i++) { /* check distanza dalla barriera con determinazione punto di intersezione rette */ spPuntoMobile.setLocation(x, y); if (spPuntoMobile.getDistance(spPallone)>=dDistance) { dCoordIntersezione[0] = spPuntoMobile.getX(); dCoordIntersezione[1] = spPuntoMobile.getY(); return dCoordIntersezione; } numerator += shortest ; if (!(numerator<longest)) { numerator -= longest ; x += dx1 ; y += dy1 ; } else { x += dx2 ; y += dy2 ; } } return dCoordIntersezione; }
dDistance è la 'distanza della barriera' e cioè quella che ci deve essere tra il punto di intersezione e B, Ho usato >= poichè trattasi infine di un'animazione 2D per cui un differenza di 1 pixel non è significativa graficamente. spPuntoMobile è uno 'sprite' cioè un oggettino da 1 pixel che sposto sulla retta di punto in punto. GetX e getDistance sono metodi dell'oggetto sprite, con il secondo determino la distanza tra due sprite nel playfield. Diciamo che simulo 'i passi' che fa l'arbitro partendo dal pallone per determinare la distanza della barriera.
Ora mi accingo a fare il resto, grazie ancora per la splendida risposta!
a presto, Aliberto