Coordinate di un punto su una retta
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
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!
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!
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...
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?
Come dovrebbe venire la x?
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...
Posta magari un pò di codice java così vediamo meglio...
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;
//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;
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:
è 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!
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!
grazie per la pazienza....però...non so perchè ma facendogli stampare il valore di cDx mi dice NaN.....va a sapere cos'ho sbagliato...
"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...
mi dà infinity e -infinity, nei due casi....
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...
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...
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%
Fammi sapere, ciao
$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%

Fammi sapere, ciao
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
cmq grazie mille....se vuoi sapere come va a finire
http://lucia23.wordpress.com/
grazie ancora
ciao
"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