Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2013, 18:18   #1
Rolana
 
Аватар для Rolana
 
Регистрация: 29.11.2013
Сообщений: 9
Печаль Секторная диаграмма

Очень нужна помощь
Задание: нарисовать секторную диаграмму, где значения x={11,12,23,40,50,60}

Вот, то что я уже написала:

int x=500, y=230, xp=500, yp=230;
double d;
...
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: добавьте любой код отрисовки...

//Ellipse(hdc,50,10,500,450); //center (275;230)

d=(11*2*3.14)/196;
x=int(xp*cos(d)+yp*sin(d));
y=int(-xp*sin(d)+yp*cos(d));
Pie(hdc,50,10,500,450,xp,yp,x,y);
xp=x; yp=y;

d=(12*2*3.14)/196;
x=int(xp*cos(d)+yp*sin(d));
y=int(-xp*sin(d)+yp*cos(d));
Pie(hdc,50,10,500,450,xp,yp,x,y);
xp=x; yp=y;

d=(23*2*3.14)/196;
x=int(xp*cos(d)+yp*sin(d));
y=int(-xp*sin(d)+yp*cos(d));
Pie(hdc,50,10,500,450,xp,yp,x,y);
xp=x; yp=y;

d=(40*2*3.14)/196;
x=int(xp*cos(d)+yp*sin(d));
y=int(-xp*sin(d)+yp*cos(d));
Pie(hdc,50,10,500,450,xp,yp,x,y);
xp=x; yp=y;

d=(50*2*3.14)/196;
x=int(xp*cos(d)+yp*sin(d));
y=int(-xp*sin(d)+yp*cos(d));
Pie(hdc,50,10,500,450,xp,yp,x,y);
xp=x; yp=y;

d=(60*2*3.14)/196;
x=int(xp*cos(d)+yp*sin(d));
y=int(-xp*sin(d)+yp*cos(d));
Pie(hdc,50,10,500,450,xp,yp,x,y);
xp=x; yp=y;

EndPaint(hWnd, &ps);
break;


Вот, то что мне показывает программа:


Ну, никак не могу понять как сделать повороты секторов. Если убрать везде xp=x; yp=y;, то прога рисует правильных размеров секторы в одном месте. А если не убирать, то у секторов какие-то странные размеры.
Rolana вне форума Ответить с цитированием
Старый 29.11.2013, 18:24   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Код:
d=(11*2*3.14)/196;
Вообще, не опнтяно, почему делится на 196, а не на 180.
Код:
int angle=30;
d=(angle+11*2*3.14)/180;
Вот вам и поворот на 30°.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 29.11.2013, 18:48   #3
Rolana
 
Аватар для Rolana
 
Регистрация: 29.11.2013
Сообщений: 9
По умолчанию

196 - это сумма элементов последовательности. Я хотела по пропорции перевести в радианы.
Но щас попробую 180 поставить, вдруг заработает) А зачем 30 градусов?

Последний раз редактировалось Rolana; 29.11.2013 в 18:51.
Rolana вне форума Ответить с цитированием
Старый 29.11.2013, 20:16   #4
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Вы же хотели повороты секторов. Вот, если к каждому прибавите 30 градусов, то каждый сектор повернется на 30 градусов. Если нужно повернуть на 45, то прибавляйте 45.
Мат. теория:
Цитата:
Перевод радиан в градусы:

Зная, что углу 2 * пи соответствует угол 360 градусов:
Ad = Ar * 180 / пи
Где Ad — угол в градусах, Ar — угол в радианах.

Перевод градусов в радианы:

Зная, что углу 360 градусов соответствует угол 2 * пи:
Ar = Ad * пи / 180
Где Ad — угол в градусах, Ar — угол в радианах.
Взято ОТСЮДА. Да и в любом учебнике 8-9 класса должно быть.
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 29.11.2013 в 20:38.
Rin вне форума Ответить с цитированием
Старый 29.11.2013, 20:48   #5
Rolana
 
Аватар для Rolana
 
Регистрация: 29.11.2013
Сообщений: 9
По умолчанию

Вот у меня уже переделано под цикл и для общего случая.
Код:
			int x=500, y=230, xp=500, yp=230;
		double angle, angle1, grad;
		int mas[] = {11, 12, 23, 40, 50, 60};
		int ArrLen = sizeof(mas)/sizeof(mas[0]); //отримуємо довжину масиву
		int summ = 0, r=225;
...
	for (int i=0; i<ArrLen; i++) 
		{
			summ += mas[i]; //рахуємо суму всіх секторів
		}
		angle1=0;
		for (int i=0; i<5; i++) 
		{
			angle = angle1+(mas[i]*2*3.14)/summ; 
			angle1=angle;
			grad=57*angle; //контроль градусів
			x = int(xp * cos(angle) + yp * sin(angle));
			y = int(-xp * sin(angle) + yp * cos(angle));
			Pie(hdc,50,10,500,460,xp,yp,x,y);
			xp = x;
			yp = y;
		}
С градусами не работает. Здесь всё в радианах.
angle1 - угол прибавления для поворота.
Теперь пропорционально куски правильные по отношению друг к другу. Но их размеры почему-то явно не соответствую заданным углам (переменная angle).

Убрала двойку в формуле вычисления угла. Секторы стали правильных размеров. Все, кроме последнего, рисуются правильно. Прям беда какая-то.
Код:
		for (int i=0; i<ArrLen; i++) 
		{
			summ += mas[i]; //рахуємо суму всіх секторів
		}
		angle1=0;
		for (int i=0; i<ArrLen; i++) 
		{
			angle = angle1+(mas[i]*3.14)/summ; 
			angle1=angle;
			grad=57*angle; //контроль градусів
			x = int(xp * cos(angle) + yp * sin(angle));
			y = int(-xp * sin(angle) + yp * cos(angle));
			Pie(hdc,50,10,500,460,xp,yp,x,y);
			xp = x;
			yp = y;
		}
Айай, по-моему, секторы всё равно неправильных размеров...
За поворот угла ОГРОМНОЕ спасибо.

Последний раз редактировалось Rolana; 29.11.2013 в 21:12. Причина: Отредактировала код)
Rolana вне форума Ответить с цитированием
Старый 29.11.2013, 21:41   #6
Rolana
 
Аватар для Rolana
 
Регистрация: 29.11.2013
Сообщений: 9
По умолчанию

Работает!!!
Rolana вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Диаграмма Falcao Visual C++ 1 04.06.2013 17:57
ER-диаграмма Tanuush Microsoft Office Access 0 14.04.2013 18:47
Диаграмма Azat_MAI Компоненты Delphi 4 05.04.2012 15:25
Диаграмма Exo Microsoft Office Excel 19 22.08.2011 16:44
Диаграмма guckaboss Microsoft Office Access 1 24.02.2011 19:11