PROBLEMA Programma in c per 2 punti equidistanti

Pubblicità
creata una funzione "int DistanzaQuadrata" che presi in input 4 valori interi(le due ascisse e le due ordinate dei due punti) restituisce la distanza al quadrato sfruttando pitagora.
estremamente rischioso in quanto hai problemi di overflow: il quadrato di un intero può essere maggiore del massimo valore di un intero. Utilizza double come tipo.

per la seconda domanda non c’è grande scelta, poiché devi solo trovare una distanza in comune non c’è bisogno che le calcoli tutte. Fermati appena ne trovi due uguali.
--- i due messaggi sono stati uniti ---
La distanza tra due punti:

Radice della somma dei quadrati dei cateti

I cateti sono la differenza delle ascisse e la differenza delle ordinate

Limiti il confronto alle basi.

Magari sbaglio.. dove?

Inviato dal mio Nexus 6P utilizzando Tapatalk
Perché due numeri possono essere gli stessi anche se formati da somme di valori diversi:
x^2 + y^2 = a^2 + b^2
per infiniti valori delle variabili x,y,a,b

(che fatica scriverlo da smartphone)
 
Ultima modifica:
Quindi?

Se la distanza è

√[ (x1-x0)^2 + (y1-y0)^2 ]

basta che i due punti 1 e 2 rispetto al.punto 0 abbiano

|x1-x0| e |y1-y0| uguali rispettivamente a
|x2-x0| e |y2-y0|

significa che sono alla stessa distanza (in qualsiasi direzione). È un problema di geometria elementare.

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Quindi?

Se la distanza è

√[ (x1-x0)^2 + (y1-y0)^2 ]

basta che due punti abbiano

|x1-x0| e |y1-y0| uguali rispettivamente a
|x2-x0| e |y2-y0|

significa che sono alla stessa distanza (in qualsiasi direzione). È un problema di geometria elementare.

Inviato dal mio Nexus 6P utilizzando Tapatalk
Ma quello è un caso particolare, due punti possono essere equidistanti ANCHE se le differenze dei cateti sono diverse. È geometria da scuole medie. La vedi subito con l’esempio che ho fatto (tutti i triangoli inscritti in un semicerchio sono retti a hanno la stessa diagonale (ossia il diametro del cerchio)
 
Ma quello è un caso particolare, due punti possono essere equidistanti ANCHE se le differenze dei cateti sono diverse. È geometria da scuole medie. La vedi subito con l’esempio che ho fatto (tutti i triangoli inscritti in un semicerchio sono retti a hanno la stessa diagonale (ossia il diametro del cerchio)

Guarda che stiamo parlando di geometria analitica. Devi disporre i punti in un piano cartesiano, non c'entrano i triangoli inscritti.

Ho detto cateti perché la differenza tra ascisse e e tra ordinate descrive sempre un triangolo rettangolo.


Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Ultima modifica:
Guarda che stiamo parlando di geometria analitica. Devi disporre i punti in un piano cartesiano, non c'entrano i triangoli inscritti.

Inviato dal mio Nexus 6P utilizzando Tapatalk
Certo che c’entrano. Un triangolo rettangolo è metà di un rettangolo dove l’ipotenusa è la diagonale. La mia è una soluzione geometrica. Vuoi quella analitica?
Fissa il valore per la diagonale (ossia la distanza)
D=sqrt(x^2+y^2)
Puoi usare il quadrato di D per evitare la radice, non importa. Risolvi per x. Fissa il valore di D. Per OGNI valore di y, potrai SEMPRE trovare un valore per x.
 
La distanza tra due punti:

Radice della somma dei quadrati dei cateti

I cateti sono la differenza delle ascisse e la differenza delle ordinate

Limiti il confronto alle basi.

Magari sbaglio.. dove?

Inviato dal mio Nexus 6P utilizzando Tapatalk

Il che ti porta ad avere una equazione di 4 variabili e di secondo grado.

a + b = c + d. a = c e b = d è solo un caso particolare.
 
Certo che c’entrano. Un triangolo rettangolo è metà di un rettangolo dove l’ipotenusa è la diagonale. La mia è una soluzione geometrica. Vuoi quella analitica?
Fissa il valore per la diagonale (ossia la distanza)
D=sqrt(x^2+y^2)
Puoi usare il quadrato di D per evitare la radice, non importa. Risolvi per x. Fissa il valore di D. Per OGNI valore di y, potrai SEMPRE trovare un valore per x.
Lascia perdere i triangoli. Vedi come si calcola la distanza tra due punti in geometria analitica.

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Non serve fare quadrati e radici: due punti sono a uguale distanza se sono uguali le differenze tra le loro coordinate cioè hanno uguali delta-x e delta-y. Semplificando Pitagora infatti, è sufficiente che siano uguali i radicandi.
No, perché i radicandi possono essere uguali anche con differenze di coordinate diverse.
Considera i punti
O(0,0) ed A(5,0): la loro distanza è 5 con deltaX=5 e deltaY=0
ora considera i punti
U(1,1) e V(4,5): la loro distanza è 5 ma deltaX=3 e deltaY=4
non puoi limitarti a confrontare le differenze, almeno l'elevazione al quadrato devi farla proprio per il motivo che dici tu: dopo aver elevato al quadrato i 2 radicandi sono uguali. L'estrazione di radice puoi evitarla, l'elevazione al quadrato no.
 
Ultima modifica:
rctimelines un esempio facile per farti capire l'errore del tuo metodo:
prendiamo i punti A(0,0) B(4,3) C(10,10) D(13,14). La distanza AB è: sqrt[(4-0)^2+(3-0)^2]=sqrt(25)=5 . La distanza CD è: sqrt[(13-10)^2+(14-10)^2]=sqrt(25)=5 . Quindi AB=CD eppure la differenza di ascisse (e ordinate) è diversa infatti X(b)-X(a)=4 mentre X(d)-X(c)=3 . Il tuo è appunto un caso particolare
--- i due messaggi sono stati uniti ---
estremamente rischioso in quanto hai problemi di overflow: il quadrato di un intero può essere maggiore del massimo valore di un intero. Utilizza double come tipo.

questo è vero ma è anche l'ultimo dei problemi :D.

per la seconda domanda non c’è grande scelta, poiché devi solo trovare una distanza in comune non c’è bisogno che le calcoli tutte. Fermati appena ne trovi due uguali.

Non capisco cosa tu voglia dire nel caso 1 mi fermo appena ne trovo 2 uguali mentre nel 2 no ma credo sia comunque più efficiente grazie al Merge Sort
 
No, perché i radicandi possono essere uguali anche con differenze di coordinate diverse.
Considera i punti
O(0,0) ed A(5,0): la loro distanza è 5 con deltaX=5 e deltaY=0
ora considera i punti
U(1,1) e V(4,5): la loro distanza è 5 ma deltaX=3 e deltaY=4
non puoi limitarti a confrontare le differenze, almeno l'elevazione al quadrato devi farla proprio per il motivo che dici tu: dopo aver elevato al quadrati i 2 radicandi sono uguali. L'estrazione di radice puoi evitarla, l'elevazione al quadrato no.
Si, in effetti deve essere uguale il radicando

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
... Non capisco cosa tu voglia dire nel caso 1 mi fermo appena ne trovo 2 uguali mentre nel 2 no ma credo sia comunque più efficiente grazie al Merge Sort
Dipende da quanti punti hai, la complessità dell’algoritmo è il quadrato del numero dei punti e devi allocare un sacco di memoria. E finito il sorting devi lo stesso scansionare tutto il vettore finché non trovi due numeri conseguivi uguali.
Piuttosto c’è un altro problema: l’arrotondamento. Difficile che due numeri double siano uguali tra loro anche se dovrebbero esserlo, a causa delle operazioni matematiche che occorre effettuare. Forse non è un grosso problema in questo caso poiché le operazioni non sono molte (e meglio evitare il calcolo della radice quadrata)
 
Pubblicità
Pubblicità
Indietro
Top