#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include "Sistema.h"
#include "Equazioni.h"
void allocaCirconferenza(Tcirconferenza *nuova)
{
nuova->equazioni=(Tmatrice *) malloc(4 * sizeof(Tmatrice));
nuova->punti=(Tpunto *) malloc(3 * sizeof(Tpunto));
int i;
for (i = 0; i < 4; i++)
{
inizializzaMatrice(&nuova->equazioni[i], 3);
if (i < 3)
{
nuova->punti[i].x=0.0;
nuova->punti[i].y=0.0;
}
}
}
void distruggiCirconferenza(Tcirconferenza *vecchia)
{
int i;
for (i = 0; i < 4; i++)
{
deallocaMatrice(&vecchia->equazioni[i]);
}
if (vecchia->equazioni != NULL)
{
free(vecchia->equazioni);
vecchia->equazioni=NULL;
}
if (vecchia->punti != NULL)
{
free(vecchia->punti);
vecchia->punti=NULL;
}
}
void immettiCoordinata(Tcirconferenza cerchio, Tpunto coordinata, int posizione)
{
if ((posizione < 0) || (posizione >=3))
{
return;
}
cerchio.punti[posizione]=coordinata;
double k;
int i;
for (i=0; i < 4; i++)
{
k=-1.0 * (cerchio.punti[posizione].x * cerchio.punti[posizione].x + cerchio.punti[posizione].y * cerchio.punti[posizione].y);
setElemento(cerchio.equazioni[i], posizione, 0, i == 1 ? k: cerchio.punti[posizione].x);
setElemento(cerchio.equazioni[i], posizione, 1, i == 2 ? k: cerchio.punti[posizione].y);
setElemento(cerchio.equazioni[i], posizione, 2, i == 3 ? k: 1.0);
}
}
int calcolaSoluzioni(Tcirconferenza cerchio, char *messaggio)
{
if (messaggio == NULL)
return 0;
double delta[4], coefficenti[3], raggio;
Tpunto centro;
int i, j;
for (i = 0; i < 4; i++)
{
delta[i]=determinante(cerchio.equazioni[i]);
}
if (fabs(delta[0]) > 1e-50)
{
for (j=0; j < 3; j++)
{
coefficenti[j]=delta[j + 1] / delta[0];
}
centro.x=coefficenti[0] / -2.0;
centro.y=coefficenti[1] / -2.0;
raggio=sqrt(centro.x*centro.x + centro.y*centro.y - coefficenti[2]);
sprintf(messaggio, "Equazione : x^2 + y^2 + a * x + b * y + c = 0\n\na = %0.5lf\nb = %0.5lf\nc = %0.5lf\n\nCentro: \nx = %0.5lf \ny = %0.5lf\nRaggio = %0.5lf",
coefficenti[0], coefficenti[1], coefficenti[2], centro.x, centro.y, raggio);
}
else
{
strcpy(messaggio, "Soluzione indeterminata");
return 0;
}
return 1;
}