[Graphics Lab Logo Image] Home  Up  Feedback  Contents  Search 

Lucrarea nr.6:

Grafice

[ Prev ] Lucrarea 6 [ Next ]

[Under Construction]

Descriere

Implementare

Aplicatii

A.Descriere

1. Grafice liniare

In urma determinarilor experimentale sau a testelor statistice se obtine o serie de rezultate a caror transpunere grafica poate fi mult mai relevanta. Reprezentarea datelor experimentale se poate face prin grafice liniare, obtinute prin unirea punctelor prin linii poligonale, prin interpolarea punctelor, histograme, diagrame, etc.

In urma determinarilor experimentale se obtine un set de puncte reprezentative:

	S={Pi(xi, yi) | xi apartine R, yi apartine R, 2 <= i <= n}

Graficele liniare se obtin prin unirea acestor puncte cu segmente de dreapta obtinandu-se o linie poligonala. Pentru realizarea unor grafice sugestive este necesar sa parcurgem o succesiune de operatii:

  • determinarea unei ferestre (window) in spatiul obiect, care sa permita o reprezentare corespunzatoare a graficului
  • trasarea unui sistem cartezian de axe de coordonate XOY si indicarea diviziunilor axelor.
  • sortarea crescatoare a punctelor in functie de coordonata x
  • desenerea unei linii poligonale care sa uneasca punctele
  • marcarea punctelor reprezentative printr-un simbol grafic (marker)

2. Histograme

O alta forma de reprezentare grafica a datelor experimentale statistice o reprezinta histogramele. In aceasta forma se reprezinta de exemplu determinarile statistice ale unei anumite caracteristici in testele efectuate asupra unei populatii. In acest caz, domeniul de variatie al caracteristicii sondate se imparte in clase de frecventa, egale sau nu ca amplitudine. Pentru fiecare clasa de frecventa se va reprezenta un dreptunghi avand ca inaltime frecventa de aparitie a caracteristicii in domeniul acelei clase de frecventa. De remarcat ca unitatile de masura si semnificatia fizica a marimilor reprezentate pe axele Ox si OY pot fi diferite.

Considerand ca amplitudinea claselor de frecventa constanta, introducerea valorilor frecventelor / clasa va tine cont de acest fapt, in sensul ca se vor introduce doar coordonatele yi ale claselor de frecventa.

Cunoscand amplitudinea unei clase de frecventa (in spatiul utilizator), de exemplu p unitati, determinarea coordonatelor x (abscise) se poate face simplu:

	xi=(i-1)*p, i=1,n

De exemplu:

3. Diagrame circulare

O alta modalitate de reprezentare grafica a datelor este diagrama circulara (pie-chart). In aceasta situatie, dreptunghiurile corespunzatoare claselor de frecventa din histograme se inlocuiesc cu sectoare circulare cu lungimile (ariile) proportionale cu valorile caracteristicii.

Divizarea cercului se face in sectoare cu unghiul la centru, proportional cu coordonatele yi ale punctelor reprezentative.

	

 

B. Implementare

 

/*======================================================================*/
/* G2Dpuncte.h                                                          */
/*======================================================================*/

/*
 * Traseaza graficul liniar corespunzator unui set de date de intrare
 * continut intr-un fisier text al carui nume este precizat de
 * parametrul nume_set.
 */
extern void grafic (char *nume_set);


/*
 * Traseaza histograma corespunzatoare unui set de date de intrare
 * continut intr-un fisier text al carui nume este precizat de
 * parametrul nume_set.
 */
extern void histograma (char *nume_set);


/*
 * Traseaza diagrama circulara corespunzatoare unui set de date de intrare
 * continut intr-un fisier text al carui nume este precizat de
 * parametrul nume_set.
 */
extern void diagrama (char *nume_set);


/*
 * Stabileste lungimile diviziunilor si marimile marcajelor
 * pe axele Ox si Oy.
 */
extern void parametri_axe (double divx, double divy, double mtkx, double mtky);

/*======================================================================*/
/* End of G2Dpuncte.h                                                   */
/*======================================================================*/
 
/*======================================================================*/
/* G2Dpuncte.c                                                          */
/*======================================================================*/

#include <stdio.h>
#include <string.h>
#include <errno.h>


#include "G2Dnucleu.h"
#include "G2Dprimitive.h"


/* Numarul maxim de puncte admis pentru un set de date */
#define MAXPCT 100


/* Structuri de Date Private -------------------------------------------*/

/* datele preluate din fisier */
static lista_puncte lista;

/* extinderile pe Ox si Oy ale graficului */
static double xvmin, xvmax, yvmin, yvmax;

static double xr, yr;

/* lungimea unei diviziuni pe axele Ox, respectiv Oy */
static double dvx = 0.0, dvy = 0.0;

/* marimea marcajului unei diviziuni pe axele Ox, respectiv Oy */
static double tkx = 0.0, tky = 0.0;

static double axax, axay;



/* Prototipuri Private -------------------------------------------------*/

/*
 * Citeste setul de date din fisierul cu numele nume_set
 * in variabila lista
 */
static void citeste_puncte (char *nume_set);

static void incadreaza_grafic (void);

static void determina_limite (void);

static void stabileste_fereastra (void);

static void traseaza_axele (void);

static void axe (void);

static void marcheaza (void);

static void diviziuni (double vmin, double vmax, char tip);


/* Rutine Publice ------------------------------------------------------*/

/*
 * Traseaza graficul liniar corespunzator unui set de date de intrare
 * continut intr-un fisier text al carui nume este precizat de
 * parametrul nume_set.
 */
void
grafic (char *nume_set)
{
   citeste_puncte (nume_set);
   if (lista.n != 0)
   {
      incadreaza_grafic ();
      traseaza_axele ();
      polilinie (lista);
   }
} /* grafic */


/*
 * Traseaza histograma corespunzatoare unui set de date de intrare
 * continut intr-un fisier text al carui nume este precizat de
 * parametrul nume_set.
 */
void
histograma (char *nume_set)
{
} /* histograma */


/*
 * Traseaza diagrama circulara corespunzatoare unui set de date de intrare
 * continut intr-un fisier text al carui nume este precizat de
 * parametrul nume_set.
 */
void
diagrama (char *nume_set)
{
} /* diagrama */


/*
 * Stabileste lungimile diviziunilor si marimile marcajelor
 * pe axele Ox si Oy.
 */
void
parametri_axe (double divx, double divy, double mtkx, double mtky)
{
   dvx = divx; dvy = divy;
   tkx = mtkx; tky = mtky;
} /* parametri_axe */



/* Rutine Private ------------------------------------------------------*/

/*
 * Citeste setul de date din fisierul cu numele nume_set
 * in variabila lista
 */
static void
citeste_puncte (char *nume_set)
{
   FILE *f = NULL;

   lista.n = 0;
   f = fopen (nume_set, "r");
   if (NULL == f)
   {
      fprintf (stderr, "Cannot open input file %s: %s\n", nume_set, strerror (errno));
      return;
   }

   while (EOF != fscanf (f, "%lf%lf", &(lista.x[lista.n]), &(lista.y[lista.n])))
   {
      lista.n++;
   }

   fclose (f);

} /* citeste_puncte */


/*
 * Determina fereastra minima care incadreaza graficul
 */
static void
incadreaza_grafic ()
{
   determina_limite ();
   stabileste_fereastra ();
} /* incadreaza_grafic */


static void
determina_limite ()
{
   /*
    * Determina valorile maxime si minime intre coordonatele x[i],
    * respectiv y[i] ale punctelor si le retine in variabilele
    * xvmin, xvmax, yvmin, yvmax; sorteaza punctele crescator dupa
    * coordonatele x[i].
    */
} /* determina_limite */


static void stabileste_fereastra ()
{
   double xmin, ymin;
   double xmax, ymax;

   /* Domeniile de variatie ale coordonatelor: */
   xr = xvmax - xvmin;
   yr = yvmax - yvmin;

   /*
    * Se va prevede o margine in jurul graficului, cu dimensiunea
    * (de exemplu) de 10% din domeniul de variatie al coordonatelor
    * x si y. Se modifica limitele ferestrei in spatiul utilizator.
    */
    xmin = xvmin - 0.1*xr;
    xmax = xvmax + 0.1*xr;
    ymin = yvmin - 0.1*yr;
    ymax = yvmax + 0.1*yr;

    set_window (xmin, ymin, xmax, ymax);

} /* stabileste_fereastra */


/*
 * Traseaza sistemul cartezian de axe de coordonate xOy.
 */
static void
traseaza_axele ()
{
   axe ();
   marcheaza ();
} /* traseaza_axele */


static void
axe ()
{
   axay = 0.0;
   if (axay < yvmin)
      axay = yvmin;
   if (axay > yvmax)
      axay = yvmax;
   linie_2d (xvmin, axay, xvmax, axay);

   axax = 0.0;
   if (axax < xvmin)
      axax = xvmin;
   if (axax > xvmax)
      axax = xvmax;
   linie_2d (axax, yvmin, axax, yvmax);
} /* axe */


/*
 * Plaseaza punctele de diviziune pe axele de coordonate.
 */
static void
marcheaza ()
{
   if ((dvx <= 0.0) || (dvy <= 0.0) ||
       (tkx <= 0.0) || (tky <= 0.0))
   {
      /* stabileste parametri impliciti */
      parametri_axe (xr/10.0, yr/10.0, xr*0.01, yr*0.01);
      diviziuni (xvmin, xvmax, 'x');
      diviziuni (yvmin, yvmax, 'y');
      parametri_axe (0.0, 0.0, 0.0, 0.0);
   }
   else
   {
      diviziuni (xvmin, xvmax, 'x');
      diviziuni (yvmin, yvmax, 'y');
   }
} /* marcheaza */


static void
diviziuni (double vmin, double vmax, char tip)
{
   double t;
   double dv;
   double tk;

   switch (tip)
   {
      case 'x':
         dv = dvx;
         tk = tkx;
         break;
      case 'y':
         dv = dvy;
         tk = tky;
         break;
   }

   /* Determina prima diviziune vizibila */
   t = 0.0;
   if (vmin < 0.0)
   {
      while (t > vmin)
         t -= dv;

      t += dv;
   }
   else
   {
      while (t < vmin)
         t += dv;
   }

   /* Traseaza punctele de diviziune pe axa data */
   while (t <= vmax)
   {
      switch (tip)
      {
         case 'x':
            linie_2d (t, axay, t, axay+tk);
            break;
         case 'y':
            linie_2d (axax, t, axax+tk, t);
            break;
      }
      t += dv;
   }

} /* diviziuni */

/*======================================================================*/
/* End of G2Dpuncte.c                                                   */
/*======================================================================*/

Download G2Dpuncte.h, G2Dpuncte.c.

C. Aplicatii

Exemplu

Trasarea graficului corespunzator unui set de puncte introduse in fisierul 'puncte.dat'.

#include "G2Dpuncte.h"

int
my_main (int argc, char *argv[])
{
   /* stabilirea explicita a marcajului axelor */
   parametri_axe (10, 5, 1, 0.5);

   grafic("puncte.dat");
}

 

Structura fisierului este:

-10
100
15.5
80.25
30
-40
70.26
10
 

1. Elaborati procedurile declarate in partea de implementare. Realizati si testati unitatea G2Dpuncte fara procedurile histograma si diagrama.

2. Scrieti un program de aplicatie care apeleaza procedura grafic. Introduceti o lista de puncte reprezentative intr-un fisier text utilizand un editor de texte.

Marcati pe grafic varfurile liniilor poligonale prin plasarea unui marker de forma:

  • "+"
  • "-"
  • "#"
  • 3. Realizati procedurile Histograma si Diagrama. Scrieti un program de aplicatie care sa traseze histograma pentru un sir de valori preluate dintr-un fisier text.

    4. Generati un sir de numere aleatoare si desenati diagrama circulara corespunzatoare.

    5. Incadrati graficele obtinute intr-un chenar la limitele ferestrei (window).

     

     

     

    Home ][ Up ][ Previous ][ Next ]

    Send mail to sorin@aspc.cs.utt.ro with questions or comments about this web site.
    Copyright © 2000 Graphics Laboratory
    Last modified: