Coordinate di un punto su una retta

kymala
Se io ho l'equazione di una retta, e le coordinate di due punti (A e B) che si trovano su questa retta. Devo trovare le coordinate del punto D, che si trova anch'egli sulla stessa retta, sapendo la distanza BD. Come faccio?

Risposte
gygabyte017
Supponendo che la retta abbia equazione $y=f(x)$. se il punto $D$ appartiene alla retta, avrà cordinate $D(x_0,f(x_0))$. Il punto B lo conosci, e ha coordinate $B(b,f(b))$ (li metto tutti generici perchè tu non hai detto quali sono!)

La distanza BD è: $BD=sqrt((D_y-B_y)^2+(D_x-B_x)^2)=sqrt((f(x_0)-f(b))^2+(x_0-b)^2)$

Quindi ottieni l'equazione $BD^2 =(f(x_0)-f(b))^2+(x_0-b)^2$ dove conosci già $b$, $BD$, e $f(x)$. Hai come unica incognita $x_0$. Risolvila e hai il risultato.

Ciao!

The borg
scrivi il punto come (x; y=mx+q) così hai solo la x come incognita fai distanza A D uguale alla distanza punto A D con la formula...

kymala
scusate ma....non mi riesce proprio.... E' che ho tutti valori generici perchè si tratta di un programma in java...dunque, ho provato a scrivere la formula scrivendo il punto D come (x, mx+q) ma forse poi ho sbagliato a risolverla perchè mi viene sempre x=0
Come dovrebbe venire la x?

gygabyte017
Beh potrebbe essere... Metti caso che la retta è $y=x$, il punto $B(1,1)$ e $BD=sqrt2$, allora D può essere anche $D(0,0)$...

Posta magari un pò di codice java così vediamo meglio...

kymala
Non so quanto si capisce così...è che sto cercando di creare un'animazione che ricrei la situazione delle bolle di sapone in due dimensioni, dunque l'intersezione di due o tre circonferenze, quando formano degli angoli di 120°. Nella loro intersezione devo disegnare un arco di cerchio. Sono arrivata al punto che mi manca solo questo punto D che sarebbe il centro da cui disegnare l'arco di cerchio che divide le due bolle.

//qui calcolo quanto vale l'angolo nel centro di uno dei due cerchi (A), poi trovo BD
//cioè la distanza dall'altro centro al centro dell'arco di intersezione delle due bolle

float coseno;
float angolo_alpha;
float BD;
float cD_x, cD_y;

coseno = (cA.r*cA.r + rapporto - cB.r*cB.r)/ (2 * cA.r * rapporto);
angolo_alpha = acos (coseno);

BD = (rapporto2 * sin(angolo_alpha)) / sin(60 - angolo_alpha);

//Retta passante per i due centri dei cerchi
float m2,p2;

//qui uso una funzione dichiarata in un'altra parte di codice
m2 = equ_rect_m(cA.x,cA.y,cB.x,cB.y);
p2 = equ_rect_p(cA.x,cA.y,cB.x,cB.y);

//le coordinate del punto B sono cB.x e cB.y
//calcolo le coordinate di D
//cD_x = sqrt (BD*BD - p2*p2 + cB.x*cB.x + cB.y*cB.y) / 2*m2*m2;
cD_x = sqrt (+ p2*p2 - BD*BD + cB.x*cB.x + cB.y*cB.y) / -2*m2*m2;

cD_y = m2*cD_x + p2;

gygabyte017
Ho capito che vuoi fare... Dammi un momento per fare i calcoli e ti dico come mi viene (sperando sia giusto)...

Tralascio il fatto che il codice:
float coseno; 
float angolo_alpha; 
float BD; 
float cD_x, cD_y; 

coseno = (cA.r*cA.r + rapporto - cB.r*cB.r)/ (2 * cA.r * rapporto); 
angolo_alpha = acos (coseno); 

BD = (rapporto2 * sin(angolo_alpha)) / sin(60 - angolo_alpha); 

//Retta passante per i due centri dei cerchi 
float m2,p2; 

//qui uso una funzione dichiarata in un'altra parte di codice 
m2 = equ_rect_m(cA.x,cA.y,cB.x,cB.y); 
p2 = equ_rect_p(cA.x,cA.y,cB.x,cB.y);


è giusto fino qui, non sapendo che fanno le funzioni che usi. Ora ti scrivo le funzioni per calcolare cD_x e cD_y...


EDIT: allora, dopo un sacco di calcoli, ecco la soluzione. Innanzitutto ti faccio notare che, dato un punto e una distanza, i possibili punti D sono 2, cioè uno su una parte della retta, e uno sull'altra. Qual'è quello giusto sta a te deciderlo.
Comunque, i due possibili valori sono:

$cD_x = - (sqrt(- (cB.x)^2*(m2)^2 + 2*(cB.x)*(m2)*(cB.y) - (p2) - (cB.y)^2 + 2*(cB.y)*(p2) + (BD)^2*((m2)^2 + 1) - (p2)^2) - cB.x - (m2)*(cB.y) - (p2))/((m2)^2 + 1) $

oppure

$cD_x = (sqrt(- (cB.x)^2*(m2)^2 + 2*(cB.x)*(m2)*(cB.y) - (p2) - (cB.y)^2 + 2*(cB.y)*(p2) + (BD)^2*((m2)^2 + 1) - (p2)^2) + cB.x + (m2)*(cB.y) - (p2))/((m2)^2 + 1) $

e da qui, $cD_y=cD_x*m2+p2$


Spero sia tutto giusto, ciao!

kymala
grazie per la pazienza....però...non so perchè ma facendogli stampare il valore di cDx mi dice NaN.....va a sapere cos'ho sbagliato...

gygabyte017
"kymala":
grazie per la pazienza....però...non so perchè ma facendogli stampare il valore di cDx mi dice NaN.....va a sapere cos'ho sbagliato...


Se da NaN (Not a Number) al 90% è perchè la radice ha argomento negativo... strano però... prova a fargli stampare l'argomento della radice solo (senza fare la radice e tutto il resto) e vedi se viene un numero negativo...

kymala
mi dà infinity e -infinity, nei due casi....

gygabyte017
Ricontrollo tutti i calcoli e ti faccio sapere...
Ma attenta però: se dà $+-oo$, non è che il tipo delle variabili è troppo piccolo per contenere un numero grande? ora non so con che ordine di grandezza lavori, ma dacci un'occhiata...

gygabyte017
Riprova con questa formula:

$cD_x=((cB.x - m2*p2 +cB.y*m2)+sqrt((cB.x - m2*p2 +cB.y*m2)^2 - (1+ (m2)^2)*((cB.x)^2+(cB.y)^2+(p2)^2 - 2*cB.y*p2-DB^2)))/(1+(m2)^2)$

e

$cD_x=((cB.x - m2*p2 +cB.y*m2)-sqrt((cB.x - m2*p2 +cB.y*m2)^2 - (1+ (m2)^2)*((cB.x)^2+(cB.y)^2+(p2)^2 - 2*cB.y*p2-DB^2)))/(1+(m2)^2)$

Stavolta è giusta al 100% :wink:

Fammi sapere, ciao

kymala
grazie...ora mi dà un risultato e mi disegna questo cerchio finalmente, solo che deve avere ancora qualche problema perchè non varia in rapporto alle due bolle come dovrebbe....mah..
cmq grazie mille....se vuoi sapere come va a finire
http://lucia23.wordpress.com/
grazie ancora
ciao

franced
"kymala":
Se io ho l'equazione di una retta, e le coordinate di due punti (A e B) che si trovano su questa retta. Devo trovare le coordinate del punto D, che si trova anch'egli sulla stessa retta, sapendo la distanza BD. Come faccio?


Tanto per cominciare ci sono 2 soluzioni.
Per trovarle ti trovi l'equazione della retta passante per $A$ e $B$.
Poi ti scrivi l'equazione del cerchio di centro $B$ e raggio pari alla distanza $BD$.
Trovi le intersezioni della retta con la circonferenza: sono le due soluzioni del problema.

Francesco Daddi

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.