Кругова діаграма

У вікні програми Кругова діаграма відображається діаграма, яка відображає частку кожної категорії в загальній сумі. Початкові дані можуть бути представлені як у “готовому вигляді” (частка кожної категорії в загальній сумі), так і без попередньої обробки. У другому випадку програма сама обчислює частку кожної категорії. Також виконується сортування вихідних даних.

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

#include "Math.h" // для доступу до sin і cos
#undef PEOPLE // діаграма "Населення землі"
#define ENERGY // діаграма "Джерела енергії"
#ifdef PEOPLE
#define HB 6
#define OBR
/* виконати попередню обробку вихідних даних
(обчислити частку кожної категорії в загальній сумі) */
// *** вихідні дані ***
AnsiString Title = "Населення землі";
// значення по кожній категорії
float [datafHB] = {1.25e9,1е9,274е6,216е6,172e6,146e6};
// частка категорії в загальній сумі (відсоток)
float pr[HB];
// *** підписи легенди ***
AnsiString dTitle[HB] = {"Китай", "Індія", "США",
"Індонезія", "Бразилія", "росія"};
// *** колір для кожної категорії ***
TColor cl[HB] = {clLime, clBlue, clMaroon,
clGreen, clYellow, clTeal};
#endif
#ifdef ENERGY
#define HB 6
#undef OBR
/* попередню обробку вихідних даних виконувати не
треба - сума елементів масиву data повинна дорівнювати 100 */
// *** вихідні дані ***
AnsiString Title = "Використання енергії";
float data[HB] = {0.5,2.5,7,23,24,40}; // значення по кожній категорії
float pr[HB]; // частка категорії в загальній сумі (відсоток)
// *** підписи легенди ***
AnsiString dTitle[HB] = {"Інші",
"Гідро електростанції",
"Атомні електростанції",
"Газ","Вугілля","Нафта"};
// *** колір для кожної категорії ***
TColor cl[HB] = {clLime, clBlue, clPurple, clSkyBlue,
clYellow, clTeal};
#endif
#define R 80 // радіус діаграми
#define D 160 // діаметр діаграми
#define TORAD 0.0174532 // коеф. перерахунку кута з градусів у радіани
/* для перерахунку величини кута з градусів у радіани,
величину в градусах треба помножити на Pi/180 */
// конструктор форми
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
int i,j;
// сортування вихідних даних методом "бульбашки"
float bd;
AnsiString bt;
TColor be;
for (i = 0; i < HB; i ++)
for (j =0 ; j < HB-1; j++)
if (data[j+1] < data[j])
{
// поміняти місцями i-ий та i+1-ий елементи
bd = data[j];
data[j] = data[j+1];
data[j+1] = bd;
bt = dTitle[j];
dTitle[j] = dTitle[j+1];
dTitle[j+1] = bt;
be = cl[j];
cl[j]=cl[j+1];
cl[j+1] = be;
}
#ifdef OBR
// обробка даних - обчислення частки
// кожної категорії в загальній сумі
float sum = 0;
for (i = 0; i < HB; i++)
sum += data[i];
for (i = 0; i < HB; i++)
pr[i] = ( data[i] / sum) * 100;
#else
// вихідні дані подано у вигляді відсотків
for ( i = 0; i < HB; i++)
#endif
}
// процедура обробки події Paint малює діаграму
void __fastcall TForm1::FormPaint(TObject *Sender)
{
int x,y;
int i;
// *** заголовок ***
Canvas->Font->Name = "Tahoma";
Canvas->Font->Size = 12;
x = (ClientWidth - Canvas->TextWidth(Title)) /2;
Canvas->Brush->Style = bsClear;
Canvas->TextOutA(x,15,Title);
// *** кругова діаграма ***
// тут х,у - координати лівого верхнього кута
// прямокутника, в який вписано коло, з якого
// вирізається сектор
x = (ClientWidth - D) /2 - R;
y = 15 + Canvas->TextHeight(Title) + 20;
int x0,y0; // центр сектора (кола)
int xl,yl; // координата точки початку дуги
int x2,y2; // координата точки кінця дуги
int al,a2; // кут між віссю ОХ і прямими,
// що обмежують сектор
int n;
n = sizeof(data) / sizeof(float);
x0 = x + R;
y0 = y + R;
al = 0; // перший сектор відкладаємо від осі ОХ
//Canvas->Pen->Style = psClear;
for (int i = 0; i < HB; i++)
{
/* через помилки округлення можлива
ситуація, коли між першим і останнім
секторами буде невеликий проміжок або
останній сектор перекриє перший.
Щоб цього не було, задамо що межа
останнього сектора збігається з прямою ОХ */
if (i != HB-1)
a2 = ( al + 3.6 * pr[i]);
else
a2 = 359;
// координата точки початку дуги
xl = x0 + R * cos (a2 * TORAD);
yl = y0 + R * sin (a2 * TORAD);
// координата точки кінця дуги
x2 = x0 + R * cos (al * TORAD);
y2 = y0 + R * sin (al * TORAD);
if ( abs(al-a2) <= 6 )
Canvas->Pen->Style = psClear;
else
Canvas->Pen->Style = psSolid;
Canvas->Brush->Color =cl[i];
Canvas->Pie(x,y,x+D,y+D,xl,yl,x2,y2);
al =a2; // наступний сектор малюємо від початку поточного
}
// легенда
Canvas->Font->Size -= 2;
int dy = Canvas->TextHeight("a");
y = y + 20;
for (i=HB-1; i >=0; i--)
{
Canvas->Brush->Color = cl[i];
Canvas->Rectangle(x,y,x+40,y+dy);
Canvas->Brush->Style = bsClear;
Canvas->TextOutA(x+50,y,dTitle[i]+", " + FloatToStrF(pr[i],ffGeneral,2,2)+"%");
y = y + dy +10;
}
}
void __fastcall TForm1::FormResize(TObject *Sender)
{
Form1->Refresh();
}

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

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