Графік

У вікні програми Графік відображається графік зміни курсу долара. Слід звернути увагу, що на графіку відображаються не значення, а відхилення від мінімального значення ряду. Це робить графік наочним навіть у тому випадку, якщо розкид значень (різниця між мінімальним і максимальним значеннями) ряду незначний.

Код написання програми

float data[] = {27.98, 28.01, 27.96, 27.96, 28.11, 28.08,
28.00, 27.98, 28.15,28.15, 28.11, 27.94, 27.86, 27.88, 27.95,
27.95};
AnsiString Title = "Зміна курсу долара";
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::FormPaint(TObject *Sender)
{
int n; // кількість точок
int x,y; // координати точки
int dx; // крок за X
int x0,y0; // координати лівого нижнього кута області
// побудови графіка
// заголовок
Canvas->Font->Name = "Tahoma";
Canvas->Font->Size = 12;
x0 = (ClientWidth - Canvas->TextWidth(Title))/2;
Canvas->Brush->Style = bsClear;
Canvas->TextOutA(x0,10,Title);
n = sizeof(data) / sizeof(float);
// знайти мінімальне і максимальне значення даних
int min,max; // індекс мінім. і максим, елемента
min =0 ; // нехай перший елемент мінімальний
max =0 ; // нехай перший елемент максимальний
{
if (data[i] < data[min]) min = i;
if (data[i] > data[max]) max = i;
}
/* Якщо відхилення значень ряду від середнього значення
незначне, то діаграма помучиться ненаглядною.
У цьому випадку можна побудувати не абсолютні значення,
а відхилення від мінімального значення ряду. */
bool frmin = true; // true - відраховувати від мінімального
// значення
dx= (ClientWidth - 20) / (n-1);
Canvas->Font->Size -= 2;
Canvas->Pen->Color = clGreen;
Canvas->Pen->Width = 1;
x0 = 10;
y0= ClientHeight - 10;
x = x0;
dx= (ClientWidth - 20) / (n-1);
for ( int i = 0; i < n; i++)
{
/* максимальному значенню відповідає
точка з координатою ClientHeight - 90 */
if (! frmin)
y = y + (ClientHeight- - 90) * data [i]/data[max] ;
else
// Відраховувати від мінімального значення
y = y0-(ClientHeight - 90) * (data[i] -data[min])/(data[max] - data[min])-10;
// поставити крапку
Canvas->Rectangle(x-2,y-2,x+2,y+2);
if (i != 0)
Canvas->LineTo(x,y);
// ** підпис даних **
/* оскільки метод TextOutA змінить положення точки
прив'язки (точки, з якої малює метод LineTo, то
після виведення тексту треба буде перемістити
покажчик у точку (х,у) */
if ( ( i == 0) || (data[i] != data[i-1]))
{
AnsiString st;
st = FloatToStrF(data[i] , ffGeneral, 5,2);
Canvas->Brush->Style= bsClear; // область виведення
// тексту - прозора
Canvas->TextOutA(x,y-20,st);
}
Canvas->MoveTo(x,y);
x += dx;
}
}
// змінився розмір вікна
void __fastcall TForm1::FormResize(TObject *Sender)
{
Form1->Refresh(); // оновити вміст вікна
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *