Круговая диаграмма - C (СИ)
Формулировка задачи:
попытаюсь предельно просто объяснить суть того, что я делаю:
Я вывожу круговую диаграмму по динамическому массиву. Причем массив структур, но это не имеет значения. Так вот. Как рисовать дуги я собственно говоря понял, а вот с прямыми у меня проблема еще та - тут надо вращать точки по кругу относительно центра. Все еще вроде нормально было, когда объекта 2 - это 2 полуокружности. Но с углами больше 180 градусов прямые стали уходить далеко за рамки экрана.
за радиус считать lng. Начальные точки - центр экрана. угол между прямыми, который должен быть - n
kol_vo - количество объектов
хотя можно к примеру все проще сделать.
X,Y - центр
a,b - углы поворота дуги
r - радиус
arc(X,Y,a,b,r) - дуга
скорее всего неправильно написаны lineto - потому-что именно они и коряво работают (я не кэп)
а как сделать линию от X,Y до краев дуги?
вот кусочек нерабочего кода:n=360./kol_vo; for(i=0;i<kol_vo;i++) { lng=10*tt(str[i].otlet.hour,str[i].otlet.minute,str[i].prilet.hour,str[i].prilet.minute); moveto(mx/2,my/2); setcolor(1+random(14)); lineto((mx/2+lng)*fabs(cos(n*i))-my*0.5*fabs(sin(n*i)),(mx/2+lng)*fabs(sin(n*i))+my*0.5*fabs(cos(n*i))); arc(mx/2,my/2,n*i,n*(i+1),lng); moveto(mx/2,my/2); lineto((mx/2-lng)*fabs(cos(n*i))-my*0.5*fabs(sin(n*i)),(mx/2-lng)*fabs(sin(n*i))+my*0.5*fabs(cos(n*i))); }
Решение задачи: «Круговая диаграмма»
textual
Листинг программы
n=360./kol_vo; for(i=0;i<kol_vo;i++) { lng=10*tt(str[i].otlet.hour,str[i].otlet.minute,str[i].prilet.hour,str[i].prilet.minute); moveto(mx/2,my/2); setcolor(1+random(14)); lineto(mx/2+lng*cos(n*i),my/2+lng*sin(n*i)); arc(mx/2,my/2,n*i,n*(i+1),lng); moveto(mx/2,my/2); lineto(mx/2-lng*cos(n*i),my/2-lng*sin(n*i)); }
Объяснение кода листинга программы
- Задается значение переменной
n
равное 360 делится на значение переменнойkol_vo
. - Запускается цикл от 0 до
kol_vo
с шагом 1. - Внутри цикла происходит расчет значения переменной
lng
на основе значений переменныхstr[i].otlet.hour
,str[i].otlet.minute
,str[i].prilet.hour
иstr[i].prilet.minute
. - Выполняется команда
moveto(mx/2,my/2)
для перемещения курсора в центр круга. - Устанавливается цвет кисти на случайное число от 1 до 14 с помощью функции
random(14)
. - Рисуется линия с помощью функции
lineto(mx/2+lng*cos(n*i),my/2+lng*sin(n*i))
. - Рисуется дуга окружности с помощью функции
arc(mx/2,my/2,n*i,n*(i+1),lng)
. - Курсор перемещается в начало координат с помощью функции
moveto(mx/2,my/2)
. - Рисуется вторая линия с помощью функции
lineto(mx/2-lng*cos(n*i),my/2-lng*sin(n*i))
. - Цикл продолжается до тех пор, пока значение переменной
i
меньшеkol_vo
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д