Problema intersezioni tra due circonferenze

di il
5 risposte

Problema intersezioni tra due circonferenze

Questo è un programma che inserite la a, la b e la c (x^2+y^2+ax+by+c=0) di due circonferenze calcola i raggi, i diametri e le eventuali intersezioni delle due circonferenze.Il programma è funzionante, i raggi e i diametri giusti ma le intersezioni non ridanno. Qualcuno sa dirmi perchè?

P.S. E' il primo programma con il C++ non andateci pesante con le critiche allo stile ma i consigli sono ben accetti

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

int main()
{
double r, m, f, g, t, d, A, B, C, D, E, F, G, H, I, L, Q, N, O, P, delta, y1, y2, x1, x2;
int a;
int b;
int c;
char M;

cout << "Inserisci la A della tua circonferenza:";
cin >> a;
cout <<" "<<endl;
cout << "Inserisci la B della tua circonferenza:";
cin >> b;
cout <<" "<<endl;
cout << "Inserisci la C della tua circonferenza:";
cin >> c;
cout <<" "<<endl;
m=pow(-a/2,2);
f=pow(-b/2,2);
t=m+f-c;
r=sqrt(t);
d=r+r;
cout << "Il raggio e' ";
cout << r;
cout <<" "<<endl;
cout <<" "<<endl;
cout << "Il diametro e'";
cout<<d<<endl;
cout <<" "<<endl;
cout << "Inserisci la A della seconda circonferenza:";
cin >> A;
cout <<" "<<endl;
cout << "Inserisci la B della seconda circonferenza:";
cin >> B;
cout <<" "<<endl;
cout << "Inserisci la C della seconda circonferenza:";
cin >> C;
cout <<" "<<endl;
L=pow(-A/2,2);
Q=pow(-B/2,2);
N=L+Q-C;
O=sqrt(N);
P=O+O;
cout << "Il raggio e' ";
cout << O;
cout <<" "<<endl;
cout <<" "<<endl;
cout << "Il diametro e'";
cout<< P;
cout <<" "<<endl;
D=a-A;
E=b-B;
F=c-C;
G=E*E+D*D;
H=2*E*F+a*D*D*E+b*D*D;
I=F*F+a*D*F+C*D;
delta = sqrt(H*H - 4*G*I);
y1 = (-H + delta) / (2*G);
y2 = (-H - delta) / (2*G);
x1=(E*y1+F)/D;
x2=(E*y2+F)/D;
cout <<" "<<endl;
if(delta == 0)
{
cout << "Le circonferenze sono tangenti nel punto:";
cout << x1;
cout << ",";
cout << y1;
}

else if (delta < 0)
{
printf("Le circonferenze non hanno punti di intersezione");
}

else if (delta > 0)
{
cout <<"Le circonferenze sono secanti nei punti:";
cout <<" "<<endl;
cout <<" "<<endl;
cout << x1;
cout << ",";
cout << y1;
cout <<" "<<endl;
cout <<" "<<endl;
cout << x2;
cout << ",";
cout << y2;
cout <<" "<<endl;
cout <<" "<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;}

Un grazie a chi mi aiuta che sto impazzendo

5 Risposte

  • Re: Problema intersezioni tra due circonferenze

    Due errori li ho trovati, adesso il programma è così ma non va ancora come dovrebbe:
    #include <cstdlib>
    #include <iostream>
    #include <stdio.h>
    #include <math.h>

    using namespace std;

    int main()
    {
    double r, m, f, g, t, d, A, B, C, D, E, F, G, H, I, L, Q, N, O, P, delta, y1, y2, x1, x2;
    int a;
    int b;
    int c;
    char M;

    cout << "Inserisci la A della tua circonferenza:";
    cin >> a;
    cout <<" "<<endl;
    cout << "Inserisci la B della tua circonferenza:";
    cin >> b;
    cout <<" "<<endl;
    cout << "Inserisci la C della tua circonferenza:";
    cin >> c;
    cout <<" "<<endl;
    m=pow(-a/2,2);
    f=pow(-b/2,2);
    t=m+f-c;
    r=sqrt(t);
    d=r+r;
    cout << "Il raggio e' ";
    cout << r;
    cout <<" "<<endl;
    cout <<" "<<endl;
    cout << "Il diametro e'";
    cout<<d<<endl;
    cout <<" "<<endl;
    cout << "Inserisci la A della seconda circonferenza:";
    cin >> A;
    cout <<" "<<endl;
    cout << "Inserisci la B della seconda circonferenza:";
    cin >> B;
    cout <<" "<<endl;
    cout << "Inserisci la C della seconda circonferenza:";
    cin >> C;
    cout <<" "<<endl;
    L=pow(-A/2,2);
    Q=pow(-B/2,2);
    N=L+Q-C;
    O=sqrt(N);
    P=O+O;
    cout << "Il raggio e' ";
    cout << O;
    cout <<" "<<endl;
    cout <<" "<<endl;
    cout << "Il diametro e'";
    cout<< P;
    cout <<" "<<endl;
    D=a-A;
    E=b-B;
    F=c-C;
    G=E*E+D*D;
    H=2*E*F-a*D*E+b*D*D; //un errore era qui
    I=F*F-a*D*F+C*D; //l'altro qui
    delta = sqrt(H*H - 4*G*I);
    y1 = (-H + delta) / (2*G);
    y2 = (-H - delta) / (2*G);
    x1=(E*y1+F)/D;
    x2=(E*y2+F)/D;
    cout <<" "<<endl;
    if(delta == 0)
    {
    cout << "Le circonferenze sono tangenti nel punto:";
    cout << x1;
    cout << ",";
    cout << y1;
    }

    else if (delta < 0)
    {
    printf("Le circonferenze non hanno punti di intersezione");
    }

    else if (delta > 0)
    {
    cout <<"Le circonferenze sono secanti nei punti:";
    cout <<" "<<endl;
    cout <<" "<<endl;
    cout << x1;
    cout << ",";
    cout << y1;
    cout <<" "<<endl;
    cout <<" "<<endl;
    cout << x2;
    cout << ",";
    cout << y2;
    cout <<" "<<endl;
    cout <<" "<<endl;
    }
    system("PAUSE");
    return EXIT_SUCCESS;}
  • Re: Problema intersezioni tra due circonferenze

    Scusa ma non hai chiarito bene gli errori/malfunzionamenti.

    Quali dati fornisci in input? Che output ottieni?
  • Re: Problema intersezioni tra due circonferenze

    In input si inseriscono le a, b e c di due circonferenze (x^2+y^2+Ax+By+C=0) e il malfunzionamento sta nel fatto che dovrebbe dare come output i punti di intersezione delle due circonferenze. Il tutto funziona ma i punti che trova sono errati e non riesco a capire il perchè
    EDIT. I punti che da dico che sono errati perchè li ho verificati e sono certo che non sono correti
  • Re: Problema intersezioni tra due circonferenze

    Non ti avevo chiesto una spiegazione dell'input ma un *vero* esempio di dati in input che hai provato ...
  • Re: Problema intersezioni tra due circonferenze

    Ciao Spero di poterti essere utile.
    In realtà avevo scritto la risposta molto prima ma per problemi di connessione non ho potuto inviartela fino ad ora. Tra l'altro l'errore che hai corretto l'ho trovato anch'io, solo che cambia un segno, dacci un'occhiata magari...

    Prima di risponderti ti do qualche consiglio piuttosto elementare:
    - Per prima cosa quando scrivi codice (anche se è semplice come in questo caso) è buona abitudine curare l'indentazione (cioè come è formattato il testo) (nonché usare il tag per il codice quando sei sul forum);
    - Dai dei nomi più intuitivi alle variabili prima di consumare tutte le lettere dell'alfabeto (o della tabella ASCII) Anche se è chiaro che in questo programma non è strettamente necessario, ti conviene utilizzare più di una volta alcune variabili per i calcoli intermedi (stando attento/a a non fare confusione), o di dare comunque dei nomi più esplicativi (pensaci: di solito si danno nomi come "b", "c", ecc. anche perché sono più brevi e comodi, ma se devi usare solo una volta una variabile tanto vale darle un nome più lungo ma comprensibile!);

    Un consiglio importante invece è questo: prima di calcolare una radice quadrata dovresti effettuare un controllo (se il numero è negativo oppure no), invece non lo fai. Ripeti questo errore tre volte nel programma, e l'ultima è quella che ti darà più problemi immagino: prima di calcolare sqrt(H*H-4*G*I) devi sapere se il delta è negativo o no, perché per esempio non puoi chiedere di calcolare sqrt(-1)! Credo anche che non ti ricordi quale sia il "delta" di un'equazione di secondo grado, che in questo caso è H*H-4*G*I... Tu prima chiedi al programma di fare la radice e poi controlli se è negativa Il codice giusto sarebbe qualcosa come
    delta = H*H - 4*G*I;
        if (delta<0)
        {
         ...
        }
        else if (delta>0)
        {
         rqdelta=sqrt(delta);
         ...
        }
        else if (delta==0)
        {
         rqdelta=sqrt(delta);
         ...
        }
    
    Così alcuni problemi dovrebbero essere risolti. Poi mi sembra (ma qui potrei sbagliare) che ci siano due errori nelle formule per H e I (come le hai ricavate?); il codice corretto dovrebbe essere questo:
    
    H=2*E*F+a*D*E+b*D*D;
    I=F*F-a*D*F+C*D;
    
    e anche
    
    x1=(-E*y1-F)/D;
    x2=(-E*y2-F)/D;
    
    Dimmi come va il programma dopo aver corretto queste cose
Devi accedere o registrarti per scrivere nel forum
5 risposte