Analizzatore di coniche

Data: 02/03/2026

Exit

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int a, b, c, d, e;
    cout << "\n Analizzatore di coniche. v0.2 (ax^2 + by^2 + cx + dy + e = 0)\n\n";
    cout << "Inserisci il coefficiente di a: ";
    cin >> a;
    cout << "Inserisci il coefficiente di b: ";
    cin >> b;
    cout << "Inserisci il coefficiente di c: ";
    cin >> c;
    cout << "Inserisci il coefficiente di d: ";
    cin >> d;
    cout << "Inserisci il coefficiente di e: ";
    cin >> e;

    cout << "\nformula conica: " << a << "x^2 + " << b << "y^2 + " << c << "x + " << d << "y + " << e;

    if (a == 0 && b == 0) {
        double m = -c / d;
        double q = -e / d;
        cout << "\n\nLa conica è una retta.";
        cout << "\nLa formula esplicita della retta è: y = " << m << "x + " << q;
        cout << "\nLa formula implicita della retta è: " << c << "x + " << d << "y + " << e;

    } else if (a != 0 && b == 0) {
        double delta = c * c - 4 * a * e;
        double vx = -c / (2 * a);
        double vy = delta / (4 * a * d);
        double fy = vy - d / (4 * a);
        double dir = vy + d / (4 * a);
        cout << "\nLa conica è una parabola parallela all'asse Y.";
        cout << "\nFormula esplicita: y = " << -a / d << "x^2 + " << -c / d << "x + " << -e / d;
        cout << "\nVertice: (" << vx << "; " << vy << ")";
        cout << "\nFuoco: (" << vx << "; " << fy << ")";
        cout << "\nDirettrice: y = " << dir;
        cout << "\nAsse di simmetria: x = " << vx;
        if (delta >= 0) {
            cout << "\nIntersezioni con asse X: (" << (-c + sqrt(delta)) / (2 * a) << "; 0) e (" << (-c - sqrt(delta)) / (2 * a) << "; 0)";
        } else {
            cout << "\nNessuna intersezione con asse X";
        }
        cout << "\nIntersezione con asse Y: (0; " << -e / d << ")\n";

    } else if (a == 0 && b != 0) {
        double delta = d * d - 4 * b * e;
        double vy = -d / (2 * b);
        double vx = delta / (4 * b * c);
        double fx = vx - c / (4 * b);
        double dir = vx + c / (4 * b);
        cout << "\nLa conica è una parabola parallela all'asse X.";
        cout << "\nFormula esplicita: x = " << -b / c << "y^2 + " << -d / c << "y + " << -e / c;
        cout << "\nVertice: (" << vx << "; " << vy << ")";
        cout << "\nFuoco: (" << fx << "; " << vy << ")";
        cout << "\nDirettrice: x = " << dir;
        cout << "\nAsse di simmetria: y = " << vy;
        if (delta >= 0) {
            cout << "\nIntersezioni con asse Y: (0; " << (-d + sqrt(delta)) / (2 * b) << ") e (0; " << (-d - sqrt(delta)) / (2 * b) << ")";
        } else {
            cout << "\nNessuna intersezione con asse Y";
        }
        cout << "\nIntersezione con asse X: (" << -e / c << "; 0)\n";

    } else if (a == b) {
        double cx = -c / (2.0 * a);
        double cy = -d / (2.0 * a);
        double r = sqrt((c * c + d * d - 4.0 * a * e) / (4.0 * a * a));
        if (r > 0) {
            cout << "\nLa conica è una circonferenza.";
            cout << "\nForma canonica: (x - " << cx << ")^2 + (y - " << cy << ")^2 = " << r * r;
            cout << "\nCentro: (" << cx << "; " << cy << ")";
            cout << "\nRaggio: " << r;
        } else if (r == 0) {
            cout << "\nLa circonferenza non esiste.";
        } else {
            cout << "\nRaggio immaginario";
        }

    } else {
        cout << "\nLa formula non è una conica di alcun tipo conosciuto.";
    }

    return 0;
}