Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Circonferenza - Equazioni.c

Equazioni.c

Caricato da: Poggi Marco
Scarica il programma completo

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <string.h>
  5. #include "Sistema.h"
  6. #include "Equazioni.h"
  7.  
  8. void allocaCirconferenza(Tcirconferenza *nuova)
  9. {
  10.     nuova->equazioni=(Tmatrice *) malloc(4 * sizeof(Tmatrice));
  11.     nuova->punti=(Tpunto *) malloc(3 * sizeof(Tpunto));
  12.     int i;
  13.     for (i = 0; i < 4; i++)
  14.     {
  15.         inizializzaMatrice(&nuova->equazioni[i], 3);
  16.         if (i < 3)
  17.         {
  18.             nuova->punti[i].x=0.0;
  19.             nuova->punti[i].y=0.0;
  20.         }
  21.  
  22.     }
  23. }
  24.  
  25. void distruggiCirconferenza(Tcirconferenza *vecchia)
  26. {
  27.     int i;
  28.     for (i = 0; i < 4; i++)
  29.     {
  30.         deallocaMatrice(&vecchia->equazioni[i]);
  31.     }
  32.     if (vecchia->equazioni != NULL)
  33.     {
  34.         free(vecchia->equazioni);
  35.         vecchia->equazioni=NULL;
  36.     }
  37.     if (vecchia->punti != NULL)
  38.     {
  39.         free(vecchia->punti);
  40.         vecchia->punti=NULL;
  41.     }
  42. }
  43.  
  44. void immettiCoordinata(Tcirconferenza cerchio, Tpunto coordinata, int posizione)
  45. {
  46.     if ((posizione < 0) || (posizione >=3))
  47.     {
  48.         return;
  49.     }
  50.     cerchio.punti[posizione]=coordinata;
  51.     double k;
  52.     int i;
  53.     for (i=0; i < 4; i++)
  54.     {
  55.         k=-1.0 * (cerchio.punti[posizione].x * cerchio.punti[posizione].x + cerchio.punti[posizione].y * cerchio.punti[posizione].y);
  56.         setElemento(cerchio.equazioni[i], posizione, 0, i == 1 ? k: cerchio.punti[posizione].x);
  57.         setElemento(cerchio.equazioni[i], posizione, 1, i == 2 ? k: cerchio.punti[posizione].y);
  58.         setElemento(cerchio.equazioni[i], posizione, 2, i == 3 ? k: 1.0);
  59.     }
  60.  
  61. }
  62.  
  63. int calcolaSoluzioni(Tcirconferenza cerchio, char *messaggio)
  64. {
  65.     if (messaggio == NULL)
  66.         return 0;
  67.     double delta[4], coefficenti[3], raggio;
  68.     Tpunto centro;
  69.     int i, j;
  70.     for (i = 0; i < 4; i++)
  71.     {
  72.         delta[i]=determinante(cerchio.equazioni[i]);
  73.     }
  74.     if (fabs(delta[0]) > 1e-50)
  75.     {
  76.         for (j=0; j < 3; j++)
  77.         {
  78.             coefficenti[j]=delta[j + 1] / delta[0];
  79.         }
  80.         centro.x=coefficenti[0] / -2.0;
  81.         centro.y=coefficenti[1] / -2.0;
  82.         raggio=sqrt(centro.x*centro.x + centro.y*centro.y - coefficenti[2]);
  83.         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",
  84.                 coefficenti[0], coefficenti[1], coefficenti[2], centro.x, centro.y, raggio);
  85.     }
  86.     else
  87.     {
  88.         strcpy(messaggio, "Soluzione indeterminata");
  89.         return 0;
  90.     }
  91.     return 1;
  92. }