Formula calcolo curva passante per 2 punti
Ciao ragazzi, scusate se la domanda vi sembra da seconda elementare ma ho un lapsus: mettiamo un piano cartesiano (x,y) dove ho due punti e ne conosco la posizione, come disegno una linea curva tra i due punti?
Da quel poco che mi ricordo da scuola c'era una formula dove tramite un coefficiente si modificava l'ampiezza della curva, ma proprio non ricordo altro!
Da quel poco che mi ricordo da scuola c'era una formula dove tramite un coefficiente si modificava l'ampiezza della curva, ma proprio non ricordo altro!
Risposte
Ciao.
A livello generale, dati due punti nel piano $A=(x_A,y_A)$ e $B=(x_B,y_B)$, per ottenere che una curva - descritta da un'equazione del tipo $F(x,y)=0$ - passi per questi due punti, basta richiedere che
${(F(x_A,y_A)=0),(F(x_B,y_B)=0):}$
Naturalmente eventuali ulteriori condizioni da richiedere dipenderanno dal tipo di curva che si vorrebbe far passare per tali punti.
Saluti.
A livello generale, dati due punti nel piano $A=(x_A,y_A)$ e $B=(x_B,y_B)$, per ottenere che una curva - descritta da un'equazione del tipo $F(x,y)=0$ - passi per questi due punti, basta richiedere che
${(F(x_A,y_A)=0),(F(x_B,y_B)=0):}$
Naturalmente eventuali ulteriori condizioni da richiedere dipenderanno dal tipo di curva che si vorrebbe far passare per tali punti.
Saluti.
Ciao!
Grazie mille per la risposta!!
Ho trovato questo: http://www.chihapauradellamatematica.or ... litica.pdf e a pagina 8 mi ha un attimo rinfrescato le idee;
Solo che il mio problema non è tanto trovare i punti della curva (usando la formula esplicita), ma proprio quella di calcolare 'automaticamente' l'equazione!
Per spiegarmi meglio, io ho due punti di cui conosco le coordinate su un piano, mi serve disegnare una curva che inizi nel primo punto e finisca nel secondo, utilizzando un coefficente per variare l'angolo della curva a piacere!
Solo che se ho capito bene, non esiste una formula "generica" di una curva, ma già nella definizione della curva sono specificati i punti..
Queste curve mi servono a puro scopo "estetico", ma proprio non ci salto fuori..
Grazie mille per la risposta!!
Ho trovato questo: http://www.chihapauradellamatematica.or ... litica.pdf e a pagina 8 mi ha un attimo rinfrescato le idee;
Solo che il mio problema non è tanto trovare i punti della curva (usando la formula esplicita), ma proprio quella di calcolare 'automaticamente' l'equazione!
Per spiegarmi meglio, io ho due punti di cui conosco le coordinate su un piano, mi serve disegnare una curva che inizi nel primo punto e finisca nel secondo, utilizzando un coefficente per variare l'angolo della curva a piacere!
Solo che se ho capito bene, non esiste una formula "generica" di una curva, ma già nella definizione della curva sono specificati i punti..
Queste curve mi servono a puro scopo "estetico", ma proprio non ci salto fuori..
Ciao.
Non solo esistono infinite curve passanti per due punti assegnati del piano, ma esistono addirittura infiniti tipi di curva che potrebbero soddisfare tale richiesta; le coniche rappresentano solamente un esempio di tipologia di curva, ma esistono altre tipologie.
Per scherzare un po', sarebbe quasi come pretendere di cercare una particolare persona specificando solamente che questa debba possedere due gambe, due braccia e una testa.
Saluti.
Non solo esistono infinite curve passanti per due punti assegnati del piano, ma esistono addirittura infiniti tipi di curva che potrebbero soddisfare tale richiesta; le coniche rappresentano solamente un esempio di tipologia di curva, ma esistono altre tipologie.
Per scherzare un po', sarebbe quasi come pretendere di cercare una particolare persona specificando solamente che questa debba possedere due gambe, due braccia e una testa.
Saluti.
Ciao, sto provando a usare un cerchio in modo da limitare le possibili curve a 2 
Credo di esserci quasi arrivato, facendo questo procedimento:
1. Calcolo il punto medio dei due punti (A e B) e lo uso come centro del cerchio (F);
2. Il raggio del cerchio è quindi la metà della distanza tra A e B
3. Sò che l'angolo tra AFB è 180°
A questo punto posso trovare qualsiasi punto P in base all'angolo tra il centro:
Px = Fx + r * cos(angle);
Py = Fy + r * sin(angle);
E fin qua tutto bene; ora il mio problema è che per poter disegnare l'arco tra A e B, devo trovare l'angolo iniziale di entrambi i punti!
Cioè, se A = [2,0], B = [-2,0] quindi F = [0,0] e r = 2, sò che A si trova a 180° mentre B a 0°
Invece se A = [0,4], B = [0,4], F = [2,2] e r = 2.83, ho che A si trova a 315° mentre B a 135
Quindi il problema è questo: sapendo coordinate di A, B, F e il raggio, come calcolo l'angolo di A o B?

Credo di esserci quasi arrivato, facendo questo procedimento:
1. Calcolo il punto medio dei due punti (A e B) e lo uso come centro del cerchio (F);
2. Il raggio del cerchio è quindi la metà della distanza tra A e B
3. Sò che l'angolo tra AFB è 180°
A questo punto posso trovare qualsiasi punto P in base all'angolo tra il centro:
Px = Fx + r * cos(angle);
Py = Fy + r * sin(angle);
E fin qua tutto bene; ora il mio problema è che per poter disegnare l'arco tra A e B, devo trovare l'angolo iniziale di entrambi i punti!
Cioè, se A = [2,0], B = [-2,0] quindi F = [0,0] e r = 2, sò che A si trova a 180° mentre B a 0°
Invece se A = [0,4], B = [0,4], F = [2,2] e r = 2.83, ho che A si trova a 315° mentre B a 135
Quindi il problema è questo: sapendo coordinate di A, B, F e il raggio, come calcolo l'angolo di A o B?
Ciao.
Se le cose stanno come credo di aver capito, il problema posto si ridurrebbe al calcolo dell'angolo che un segmento, avente estremi con coordinate assegnate, forma rispetto all'asse $x$.
Dati due punti $A=(x_A,y_A)$ e $B=(x_B,y_B)$, l'angolo $alpha$ che il segmento $bar(AB)$ forma rispetto all'asse $x$ è dato da
$alpha=arctg((y_A-y_B)/(x_A-x_B))$ (con $x_A!=x_B$)
Non so se io abbia contribuito alla risoluzione del problema.
Saluti.
Se le cose stanno come credo di aver capito, il problema posto si ridurrebbe al calcolo dell'angolo che un segmento, avente estremi con coordinate assegnate, forma rispetto all'asse $x$.
Dati due punti $A=(x_A,y_A)$ e $B=(x_B,y_B)$, l'angolo $alpha$ che il segmento $bar(AB)$ forma rispetto all'asse $x$ è dato da
$alpha=arctg((y_A-y_B)/(x_A-x_B))$ (con $x_A!=x_B$)
Non so se io abbia contribuito alla risoluzione del problema.
Saluti.
Ciao alessandro!
Ieri notte complice l'insonnia ho risolto, usando proprio il metodo da te descritto!
Il risultato fino ad ora è questo:
Il codice che uso (javascript) è questo:
Ora però, livello successivo: voglio spostare il fuoco in modo da 'addolcire' la curva, generando un cerchio più grande ma usando un arco più corto.
Per fare ciò, devo:
1. Calcolare il punto medio M tra i due punti (che è quello che ora uso come centro del cerchio F)
2. Calcolare una retta che passi per M ma sia perpendicolare alla retta AB
3. Calcolare la posizione del centro del cerchio F, sapendo la distanza tra questo ed M, mantenendolo ovviamente sulla retta di prima
4. Calcolare l'angolo tra la retta FA e FB (visto che ora non è più fisso a 180°)
E qui sono in alto mare, e mi spaventa molto il punto 4 perchè in tutte le formule che ho visto per calcolare l'angolo è richiesta la lunghezza dell'arco, ma è un dato che io non ho!
Ieri notte complice l'insonnia ho risolto, usando proprio il metodo da te descritto!
Il risultato fino ad ora è questo:

Il codice che uso (javascript) è questo:
function (time, from, to, duration, forceTop) { var F = [((from.lat + to.lat) / 2), ((from.lng + to.lng) / 2)]; var AFB = 180; // angolazione totale tra A, F e B var r = Math.sqrt(Math.pow(to.lat - from.lat, 2) + Math.pow(to.lng - from.lng, 2)) / 2; var C = (2 * Math.PI) * r; var AB = (C * AFB)/360; // Lunghezza arco var startAngle = (AFB / Math.PI * Math.atan2(from.lng - F[1], from.lat - F[0])); var endAngle = (AFB / Math.PI * Math.atan2(to.lng - F[1], to.lat - F[0])); // calculate progress percentage var p = (time / duration) * 100; var pAngle = (p * AFB) / 100; if(pAngle >= AFB){ return [to.lat, to.lng]; } if(startAngle > endAngle && true === forceTop){ pAngle = startAngle - pAngle; } else { pAngle += startAngle; } var radial = Math.PI * (pAngle / 180); var x = F[0] + (r * Math.cos(radial)); var y = F[1] + (r * Math.sin(radial)); console.log(x,y); return [x, y]; };
Ora però, livello successivo: voglio spostare il fuoco in modo da 'addolcire' la curva, generando un cerchio più grande ma usando un arco più corto.
Per fare ciò, devo:
1. Calcolare il punto medio M tra i due punti (che è quello che ora uso come centro del cerchio F)
2. Calcolare una retta che passi per M ma sia perpendicolare alla retta AB
3. Calcolare la posizione del centro del cerchio F, sapendo la distanza tra questo ed M, mantenendolo ovviamente sulla retta di prima
4. Calcolare l'angolo tra la retta FA e FB (visto che ora non è più fisso a 180°)
E qui sono in alto mare, e mi spaventa molto il punto 4 perchè in tutte le formule che ho visto per calcolare l'angolo è richiesta la lunghezza dell'arco, ma è un dato che io non ho!
Ciao.
Potresti procedere in questo modo (se ho colto l'essenza del problema):
-parti dall'equazione generale della circonferenza $x^2+y^2+ax+by+c=0$ (con $a,b,c in RR$ da determinare);
-richiedi il passaggio di questa generica curva per i punti $A=(x_A,y_A),B=(x_B,y_B)$ assegnati, in questo modo
$x_A^2+y_A^2+ax_A+by_A+c=0 Rightarrow c=-x_A^2-y_A^2-ax_A-by_A$
quindi
$x^2+y^2+ax+by-x_A^2-y_A^2-ax_A-by_A=0$
è l'insieme delle infinite circonferenze passanti per il punto $A$.
Ora, richiedendo il passaggio di quest'ultima curva per il punto $B$, si otterrà:
$x_B^2+y_B^2+ax_B+by_B-x_A^2-y_A^2-ax_A-by_A=0$
cioè
$a(x_B-x_A)+b(y_B-y_A)+(x_B^2-x_A^2)+(y_B^2-y_A^2)=0$
da cui ricavare $a$ in funzione di $b$ (o viceversa, a seconda del fatto che $y_B-y_A!=0$ o che $x_B-x_A!=0$).
In questo modo si ottiene un fascio di circonferenze dipendente da un unico parametro (che io chiamo $k$, ma che, di fatto, coincide o con $a$ o con $b$):
$x^2+y^2+f(k)*x+g(k)*y+h(k)=0$
A questo punto le coordinate del centro $F(k)$ della circonferenza sono date da:
$F(k)=(-(f(k))/2,-(g(k))/2)$
Non so se ciò ti sia d'aiuto.
Saluti.
Potresti procedere in questo modo (se ho colto l'essenza del problema):
-parti dall'equazione generale della circonferenza $x^2+y^2+ax+by+c=0$ (con $a,b,c in RR$ da determinare);
-richiedi il passaggio di questa generica curva per i punti $A=(x_A,y_A),B=(x_B,y_B)$ assegnati, in questo modo
$x_A^2+y_A^2+ax_A+by_A+c=0 Rightarrow c=-x_A^2-y_A^2-ax_A-by_A$
quindi
$x^2+y^2+ax+by-x_A^2-y_A^2-ax_A-by_A=0$
è l'insieme delle infinite circonferenze passanti per il punto $A$.
Ora, richiedendo il passaggio di quest'ultima curva per il punto $B$, si otterrà:
$x_B^2+y_B^2+ax_B+by_B-x_A^2-y_A^2-ax_A-by_A=0$
cioè
$a(x_B-x_A)+b(y_B-y_A)+(x_B^2-x_A^2)+(y_B^2-y_A^2)=0$
da cui ricavare $a$ in funzione di $b$ (o viceversa, a seconda del fatto che $y_B-y_A!=0$ o che $x_B-x_A!=0$).
In questo modo si ottiene un fascio di circonferenze dipendente da un unico parametro (che io chiamo $k$, ma che, di fatto, coincide o con $a$ o con $b$):
$x^2+y^2+f(k)*x+g(k)*y+h(k)=0$
A questo punto le coordinate del centro $F(k)$ della circonferenza sono date da:
$F(k)=(-(f(k))/2,-(g(k))/2)$
Non so se ciò ti sia d'aiuto.
Saluti.
Ciao, ammetto di non aver capito molto..
Sempre senza saper ne leggere ne scrivere io stavo provando così:
1. So che A e B sono in linea retta, calcolo il punto medio M e li ho il mio cerchio di cui posso calcolare vita morte e miracoli
2. A questo punto, posso calcolare qualsiasi punto sulla circonferenza dando un angolo; pertanto prendo l'angolo a 90° da A o B
3. Ora mi ritrovo con un nuovo centro la cui circonferenza passa sicuramente da A e B.
4. So anche che l'angolo AB è di 90°, quindi riparto da zero e rifaccio tutti i calcoli
Se così funziona sono a posto, perchè per cambiare la "dolcezza" della curva devo solo spostare il secondo centro più vicino o lontano da A e B!
In teoria dovrebbe funzionare ma ottengo dei risultati molto strani.. ora devo scappare, più tardi ti posto il codice che uso e il risultato!
Nel frattempo ti ringrazio veramente, sei stato utilissimo!
Quando il progetto è finito (si basa su leaflet.js) te ne mando una copia così mi dici che ne pensi
Sempre senza saper ne leggere ne scrivere io stavo provando così:
1. So che A e B sono in linea retta, calcolo il punto medio M e li ho il mio cerchio di cui posso calcolare vita morte e miracoli
2. A questo punto, posso calcolare qualsiasi punto sulla circonferenza dando un angolo; pertanto prendo l'angolo a 90° da A o B
3. Ora mi ritrovo con un nuovo centro la cui circonferenza passa sicuramente da A e B.
4. So anche che l'angolo AB è di 90°, quindi riparto da zero e rifaccio tutti i calcoli
Se così funziona sono a posto, perchè per cambiare la "dolcezza" della curva devo solo spostare il secondo centro più vicino o lontano da A e B!
In teoria dovrebbe funzionare ma ottengo dei risultati molto strani.. ora devo scappare, più tardi ti posto il codice che uso e il risultato!
Nel frattempo ti ringrazio veramente, sei stato utilissimo!
Quando il progetto è finito (si basa su leaflet.js) te ne mando una copia così mi dici che ne pensi

Ciao.
Cerco di chiarire con un esempio numerico.
Siano $A=(1,2)$ e $B=(3,0)$; partendo dall'equazione generale della circonferenza
$x^2+y^2+ax+by+c=0$
si richiede il passaggio della circonferenza per il punto $A$
$1^2+2^2+a*1+b*2+c=0 Rightarrow c=-a-2b-5$
quindi si ottiene
$x^2+y^2+ax+by+(-a-2b-5)=0$
che rappresenta le infinite circonferenze passanti per $A=(1,2)$.
Ora si richiede il passaggio per il punto $B$:
$3^2+0^2+a*3+b*0+(-a-2b-5)=0 Rightarrow ... Rightarrow b=a+2$
e si ottiene
$x^2+y^2+ax+(a+2)y+(-3a-9)=0$
che rappresenta le infinite circonferenze passanti sia per il punto $A=(1,2)$ che per il punto $B=(3,0)$.
Il centro $F(a)$ dipendente dal parametro $a$ ha le seguenti coordinate:
$F(a)=(-a/2,-(a+2)/2)=(-a/2,-a/2-1)$
Spero di aver meglio chiarito.
Saluti.
Cerco di chiarire con un esempio numerico.
Siano $A=(1,2)$ e $B=(3,0)$; partendo dall'equazione generale della circonferenza
$x^2+y^2+ax+by+c=0$
si richiede il passaggio della circonferenza per il punto $A$
$1^2+2^2+a*1+b*2+c=0 Rightarrow c=-a-2b-5$
quindi si ottiene
$x^2+y^2+ax+by+(-a-2b-5)=0$
che rappresenta le infinite circonferenze passanti per $A=(1,2)$.
Ora si richiede il passaggio per il punto $B$:
$3^2+0^2+a*3+b*0+(-a-2b-5)=0 Rightarrow ... Rightarrow b=a+2$
e si ottiene
$x^2+y^2+ax+(a+2)y+(-3a-9)=0$
che rappresenta le infinite circonferenze passanti sia per il punto $A=(1,2)$ che per il punto $B=(3,0)$.
Il centro $F(a)$ dipendente dal parametro $a$ ha le seguenti coordinate:
$F(a)=(-a/2,-(a+2)/2)=(-a/2,-a/2-1)$
Spero di aver meglio chiarito.
Saluti.