Круговая диаграмма - C (СИ)

Узнай цену своей работы

Формулировка задачи:

попытаюсь предельно просто объяснить суть того, что я делаю: Я вывожу круговую диаграмму по динамическому массиву. Причем массив структур, но это не имеет значения. Так вот. Как рисовать дуги я собственно говоря понял, а вот с прямыми у меня проблема еще та - тут надо вращать точки по кругу относительно центра. Все еще вроде нормально было, когда объекта 2 - это 2 полуокружности. Но с углами больше 180 градусов прямые стали уходить далеко за рамки экрана. за радиус считать lng. Начальные точки - центр экрана. угол между прямыми, который должен быть - n kol_vo - количество объектов хотя можно к примеру все проще сделать. X,Y - центр a,b - углы поворота дуги r - радиус arc(X,Y,a,b,r) - дуга

а как сделать линию от 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)));
    }
скорее всего неправильно написаны lineto - потому-что именно они и коряво работают (я не кэп)

Решение задачи: «Круговая диаграмма»

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));
        }

Объяснение кода листинга программы

  1. Задается значение переменной n равное 360 делится на значение переменной kol_vo.
  2. Запускается цикл от 0 до kol_vo с шагом 1.
  3. Внутри цикла происходит расчет значения переменной lng на основе значений переменных str[i].otlet.hour, str[i].otlet.minute, str[i].prilet.hour и str[i].prilet.minute.
  4. Выполняется команда moveto(mx/2,my/2) для перемещения курсора в центр круга.
  5. Устанавливается цвет кисти на случайное число от 1 до 14 с помощью функции random(14).
  6. Рисуется линия с помощью функции lineto(mx/2+lng*cos(n*i),my/2+lng*sin(n*i)).
  7. Рисуется дуга окружности с помощью функции arc(mx/2,my/2,n*i,n*(i+1),lng).
  8. Курсор перемещается в начало координат с помощью функции moveto(mx/2,my/2).
  9. Рисуется вторая линия с помощью функции lineto(mx/2-lng*cos(n*i),my/2-lng*sin(n*i)).
  10. Цикл продолжается до тех пор, пока значение переменной i меньше kol_vo.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.833 из 5