Formula calcolo curva passante per 2 punti

strae
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!

Risposte
Sk_Anonymous
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.

strae
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..

Sk_Anonymous
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.

strae
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?

Sk_Anonymous
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.

strae
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:
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!

Sk_Anonymous
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.

strae
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 ;)

Sk_Anonymous
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.

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