Może ktoś kiedyś używał biblioteki ChartDirector.
Mam problem. Chcę zrobić aplikację okienkową w GTK+. Na razie testuję możliwości tej biblioteki.
Napisałem sobie prosty programik, który tworzy wykres, rysuje sinus(x), zapisuje na dysk, tworzy drugą linię dla cosinus(x), zapisuje na dysk. Jednak w obydwu plikach narysowany jest tylko sinus(x). Oczywiście, gdy tworzenie obydwu linii wrzucę przed zapisywanie, ładnie się obydwie linie narysują.
Czy trzeba za każdym razem tworzyć nowy obiekt wykresu?
kod:
#include "chartdir.h"
#include <cstring>
#include <iostream>
#include <cmath>
void createSinusData(double *data) ;
void createCosinusData(double *data) ;
int main(int argc, char *argv[])
{
double sindata[37] ;
createSinusData(sindata) ;
double cosdata[37] ;
createCosinusData(cosdata) ;
const char *labels[37] =
{
"-540°", "-510°", "-480°", "-450°", "-420°", "-390°",
"-360°", "-330°", "-300°", "-270°", "-240°", "-210°",
"-180°", "-150°", "-120°", "-90°", "-60°", "-30°",
"0°",
"30°", "60°", "90°", "120°", "150°", "180°",
"210°", "240°", "270°", "300°", "330°", "360°",
"390°", "420°", "450°", "480°", "510°", "540°",
};
XYChart *c = new XYChart(750, 300);
c->setBackground(0xEEEEEE) ;
c->setPlotArea(30, 70, 700, 200,
0xFFFFFF, 0xF8F8F8, -1, 0xC0C0C0, 0xC0c0c0);
//first layer: sin(x)
LineLayer *layer0 = c->addLineLayer(
DoubleArray(sindata, (int)(sizeof(sindata) / sizeof(sindata[0]))),
0xFF8000,
"sinus(x)"
);
layer0->setLineWidth(3) ;
c->xAxis()->setLabels(StringArray(labels, (int)(sizeof(labels) / sizeof(labels[0]
))));
c->xAxis()->setWidth(2) ;
c->yAxis()->setWidth(2) ;
c->xAxis()->setLabelStep(3);
TextBox *title = c->addTitle("Trigonometric Functions", "ariali.ttf", 15);
LegendBox *legendBox = c->addLegend(c->getWidth() / 2, title->getHeight(), false,
"arialbi.ttf", 10);
legendBox->setBackground(0xFFFFFF, 0x000000);
legendBox->setAlignment(Chart::TopCenter);
legendBox->setLineStyleKey();
//output
c->enableVectorOutput() ;
const char fileNameSVG1[] = "simplepie1.svg" ;
const char fileNameSVG2[] = "simplepie2.svg" ;
c->makeChart(fileNameSVG1);
// second layer
LineLayer *layer1 = c->addLineLayer(
DoubleArray(cosdata, (int)(sizeof(cosdata) / sizeof(cosdata[0]))),
0x00FF00,
"cosinus(x)"
);
layer1->setLineWidth(3) ;
c->makeChart(fileNameSVG2);
delete c;
return 0;
}
void createSinusData(double *data)
{
for(int i=-18; i<=18; ++i)
{
int degrees = i*30 ;
double radians = degrees*M_PI/180.0 ;
double sinus = sin(radians) ;
data[i+18]=sinus ;
}
}
void createCosinusData(double *data)
{
for(int i=-18; i<=18; ++i)
{
int degrees = i*30 ;
double radians = degrees*M_PI/180.0 ;
double cosinus = cos(radians) ;
data[i+18]=cosinus ;
}
}
jest:
plik1//rafalrutkowski.netai.net/sinus.svg
plik2//rafalrutkowski.netai.net/sinus.svg
powinno być:
plik1//rafalrutkowski.netai.net/sinus.svg
plik2//rafalrutkowski.netai.net/cosinus.svg
z góry dzięki za wszelkie rady