CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Rysowanie wykresów

Rysowanie wykresów

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Rysowanie wykresów

Nowy postprzez gregory » wtorek, 5 kwietnia 2011, 15:52

Witam.
Piszę program, w którym będę musiał najprawdopodobniej zamieścić funkcję rysowania wykresów słupkowych bądź kołowych. Jak najszybciej i najłatwiej można zrobić coś takiego w C++ Builder (o ile jest to oczywiście możliwe) ?
Avatar użytkownika
gregory
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 17 lutego 2010, 17:36
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows 7Chrome

Re: Rysowanie wykresów

Nowy postprzez Cyfrowy Baron » wtorek, 5 kwietnia 2011, 17:54

Najszybciej, choć nie koniecznie najprościej to z wykorzystaniem komponentu TChart. Prościej, ale z dużym nakładem pracy to tworząc własne funkcje rysujące z wykorzystaniem klasy TCanvas.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Rysowanie wykresów

Nowy postprzez gregory » sobota, 11 czerwca 2011, 13:50

Po dłuższej przerwie postanowiłem się zabrać za to rysowanie wykresu w swojej aplikacji, właściwie zostawiłem to na koniec. Wybrałem komponent TChart, ale męczę się i nie wiem jak do niego dodać odpowiednie wartości. Na osi X będę miał jakby przedziały pieniężne a na osi Y ilość wartości w tych przedziałach. Np
kwota: (0-5000) - 12, (5000 - 10000) - 8, (10000 - 2000) - 5. Jak to dodać do komponentu TChart?
Avatar użytkownika
gregory
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 17 lutego 2010, 17:36
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows 7Chrome

Re: Rysowanie wykresów

Nowy postprzez Cyfrowy Baron » sobota, 11 czerwca 2011, 15:35

gregory napisał(a):kwota: (0-5000) - 12, (5000 - 10000) - 8, (10000 - 2000) - 5.


Nie rozumiem. Jak te grupy wartości mają się do osi XY?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Rysowanie wykresów

Nowy postprzez gregory » sobota, 11 czerwca 2011, 16:19

Może źle wytłumaczyłem. Ogólnie to potrzebuję zrobić mniej więcej taki wykres:
http://dl.dropbox.com/u/19644599/obrazek.png
Avatar użytkownika
gregory
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 17 lutego 2010, 17:36
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows 7Chrome

Re: Rysowanie wykresów

Nowy postprzez Cyfrowy Baron » sobota, 11 czerwca 2011, 18:23

Kombinowałem, ale nie potrafię zrobić w TChart tych zakresów na osi X.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Rysowanie wykresów

Nowy postprzez gregory » niedziela, 12 czerwca 2011, 11:46

To jak to można inaczej rozwiązać? Może skorzystać z klasy Canvas? Jak tam narysować taki wykres?
Avatar użytkownika
gregory
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 17 lutego 2010, 17:36
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows XPFirefox

Re: Rysowanie wykresów

Nowy postprzez Cyfrowy Baron » niedziela, 12 czerwca 2011, 16:02

gregory napisał(a):Może skorzystać z klasy Canvas? Jak tam narysować taki wykres?


A jak się rysuje na TCanvas?! Posługujesz się metodami tej klasy. Niestety klasa nie zawiera żadnych metod do rysowania wykresów, a to oznacza, że wszystkie kreski, kropki0, figury geometryczne musisz oprogramować. Gdybym chciał na TImage narysować taki wykres, jak pokazałeś na rysunku, to zrobiłbym to tak:

KOD cpp:     UKRYJ  
#include <math.h>

void DrawHLine(TCanvas *Canvas, int cLeft, int cRight, int cTop, String cCaption)
{
 Canvas->MoveTo(cLeft, cTop);
 Canvas->LineTo(cRight, cTop);

 Canvas->TextOut(cLeft - 20, cTop - 8, cCaption);
}
//---------------------------------------------------------------------------
void DrawVLine(TCanvas *Canvas, int cTop, int cBottom, int cLeft)
{
 Canvas->MoveTo(cLeft, cTop);
 Canvas->LineTo(cLeft, cBottom);
}
//---------------------------------------------------------------------------
void RysujSiatke(TImage *Image)
{
 TRect gRect = Rect(32, 8, Image->Width - 8, Image->Height - 32);
 TCanvas *gCanv = Image->Canvas;

 DrawVLine(gCanv, gRect.Top, gRect.Top + gRect.Height(), gRect.Left);

 int ws = floor(gRect.Width() / 5);
 int lBottom = gRect.Top + floor(gRect.Height() / 5) * 5;

 for(int i = 1; i < 6; i++)
 {
  DrawVLine(gCanv, lBottom, lBottom + 4, gRect.Left + (ws * i));
 }

 DrawHLine(gCanv, gRect.Left - 4, gRect.Left + gRect.Width(), gRect.Top, "25");

         ws = floor(gRect.Height() / 5);
 for(int i = 1; i < 6; i++)
 {
  DrawHLine(gCanv, gRect.Left - 4, gRect.Left + gRect.Width(),
            gRect.Top + ws * i, String(25 - (i * 5)) );
 }
}
//---------------------------------------------------------------------------

void DrawVRectangle(TCanvas *Canvas, int cLeft, int cTop, int cBottom, TColor Color)
{
Canvas->Brush->Style = bsSolid;
 Canvas->Brush->Color = Color;
 Canvas->Rectangle(cLeft, cTop, cLeft + 32, cBottom);
}
//---------------------------------------------------------------------------
void RysujSlupki(TImage *Image)
{
 TRect gRect = Rect(32, 8, Image->Width - 8, Image->Height - 32);
 TCanvas *gCanv = Image->Canvas;

 int ws = floor(gRect.Width() / 10);
 int lBottom = gRect.Top + floor(gRect.Height() / 5) * 5 + 1;

 int tws = floor(gRect.Height() / 5);

 int tabTop[] = {
                                 (tws * 2) + 10,
                                  tws  - 10,
                                  tws + 10,
                                 (tws * 4),
                                 (tws * 3) + 10
                                };

 String tabCaption[] = {"0 - 5000", "5000 - 10000", "10000 - 15000",
                        "15000 - 20000", "20000 - "};

 int wsleft = ws / 2;
 int t = 0;
 for(int i = 1; i < 10; i += 2)
 {
  DrawVRectangle(gCanv, gRect.Left + (ws * i) - 16,
                                 gRect.Top + tabTop[t],
                                 lBottom, clSkyBlue);

  gCanv->Brush->Style = bsClear;
  gCanv->TextOut(gRect.Left + (ws * i) - wsleft, lBottom, tabCaption[t]);
  t++;
 }

}
//---------------------------------------------------------------------------
void RysujWykres(TImage *Image)
{
 RysujSiatke(Image);
 RysujSlupki(Image);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 RysujWykres(Image1);
}


Tylko, że ten wykres ma wartości zdefiniowane jawnie, ma tylko częściowe skalowanie wysokości słupków, bo nie chciało mi się nad tym ślęczeć. Ma jednak skalowanie względem rozmiaru obiektu typu TImage na którym jest rysowany. Jeżeli wykres ma być tworzony dynamicznie, to trzeba ten kod ulepszyć. To co masz wystarcza, do opracowania wykresu.


Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
gregory
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Rysowanie wykresów

Nowy postprzez gregory » poniedziałek, 13 czerwca 2011, 15:06

Wielkie dzięki za kod. Analizowałem go i nie rozumiem jak obliczasz wysokość słupków. Ja mam własne wartości zapisane w zmiennych typu int i je chciałbym jakoś wstawić.
Avatar użytkownika
gregory
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 17 lutego 2010, 17:36
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows 7Chrome

Re: Rysowanie wykresów

Nowy postprzez Cyfrowy Baron » wtorek, 14 czerwca 2011, 00:11

gregory napisał(a): Analizowałem go i nie rozumiem jak obliczasz wysokość słupków.


To mniej więcej ten kod:

KOD cpp:     UKRYJ  
int ws = floor(gRect.Width() / 10);
 int lBottom = gRect.Top + floor(gRect.Height() / 5) * 5 + 1;

 int tws = floor(gRect.Height() / 5);

 int tabTop[] = {
                                 (tws * 2) + 10,
                                  tws  - 10,
                                  tws + 10,
                                 (tws * 4),
                                 (tws * 3) + 10
                                };

 String tabCaption[] = {"0 - 5000", "5000 - 10000", "10000 - 15000",
                        "15000 - 20000", "20000 - "};


Wysokość słupków jest przechowywana w tablicy tabTop, a obliczana jest w oparciu o rozmiar obiektu Image. Rysowanie słupków, które są prostokątami musi odbywać się względem góry obiektu Image, a nie osi X, która jest tylko linią graficzną. Poszedłem na łatwiznę i nie obliczałem wysokości słupków, lecz obliczałem ich pozycję Y (Top) względem góry Image. Ty musisz raczej opracować algorytm obliczający położenie słupków względem osi X. Musi jednak pamiętać, że kod rysujący słupki to:

KOD cpp:     UKRYJ  
Canvas->Rectangle(cLeft, cTop, cLeft + 32, cBottom);


czyli Rectangle(X1, Y1, X2, Y2), gdzie X1 - Left, Y1 - Top, X2 - Left + szerokość prostokąta, Y2 - Top + wysokość prostokąta.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 12 gości

cron