Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на BASIC / Visual Basic / Гед Мид. Удачные диаграммы GDI+ Работа с графикой [doc].doc
Скачиваний:
32
Добавлен:
02.05.2014
Размер:
870.4 Кб
Скачать

Вычислите Общее значение

    Давайте остановимся здесь и проверим, чем является то, что мы делаем. Мы хотим показать «долю» каждой компании на диаграмме так, чтобы каждая размещалась в реальной пропорции. Так, если к примеру, общее количество четырех Amount было 1000, и первая компания имела свою Amount равным 250, то вы, конечно, ожидаете, чтобы ее сегмент на диаграмме занимал 25%, четверть, доступного пространства. В реальной жизни, числа редко бывают так дружественны к пользователю, но мы можем использовать некоторую базовую математику, чтобы заставить .NEТ выполнять грубую работу для нас.     Расчет общего значения достаточно легок. Перечислите каждое отдельное значение, которое мы поместили в массив, по очереди добавляя каждое отдельное значение к общему:

Dim TotalCount As Single

For Each gd As GraphData In Companies

TotalCount += gd.Amount

Next

    Это значение TotalCount очень скоро будет использоваться в формуле, которая размещает правильные сегменты диаграммы для каждой компании.

Вычислите Доли и Нарисуйте Диаграмму

Мы собираемся написать код, который вычисляет эти доли, которые представляют каждую компанию на диаграмме, а затем рисует соответствующие цветные сегменты. Критическая часть информации, которую мы должны передать рисующему коду, это сообщить: 1.Где начать рисование следующего сегмента и 2.Насколько большим должен быть этот сегмент. Чтобы сделать это мы должны понимать две концепции, которые иногда представляют трудность для новичков в GDI+. Это StartAngle и SweepAngle. a. StartAngle. Круговая Диаграмма – это эллипс, который, как вам известно, имеет 360 градусов. Хотя вы можете ожидать, что самая верхняя точка эллипса может быть 0 градусов, в GDI+ это не соответствует действительности. Фактически, точка 0 градусов находится в крайней правой точке эллипса, на горизонтальной линии, проведенной через центр. Это звучит сложнее, чем является на самом деле, и чтобы доказать это есть картинка, которая действительно стоит тысячи слов, вот она:

    Значение StartAngle возрастает, когда вы движетесь по кругу по часовой стрелке от точки 0 градусов. Вы можете видеть это на рисунке выше. StartAngle это просто точка в градусах на эллипсе, от которой начинается любая дуга. Так, в условиях круговой диаграммы, которую мы здесь создаем, мы будем заинтересованы в StartAngle (или начальной точке в градусах) для сегмента каждой компании.     b. SweepAngle. SweepAngle, вероятно, менее запутывающий. Дуга измеряется в градусах. SweepAngle – это число градусов, которое охватывает любая дуга. В примере, указанном выше, выделенный сегмент имеет SweepAngle около 45 градусов (а StartAngle – 200).     Снова, имея дело с нашей диаграммой компаний, SweepAngle представляет число градусов сегмента диаграммы, в котором мы размещает каждую отдельную компанию. То есть пропорциональную часть от 360 градусов, которая должна быть выделена для отдельной компании.

Рисуем диаграмму

Вооружившись нашими цифрами, мы теперь можем нарисовать нашу круговую диаграмму. Продолжаем наше OnPaint:

' Создает переменные для хранения значений углов

Dim StartAngle As Single = 0

Dim SweepAngle As Single = 0

И мы пройдем в цикле по всем данным для каждой компании, рисуя ее сегмент выбранного цвета.

For Each gd As GraphData In Companies

SweepAngle = 360 * gd.amount / TotalCount

g.FillPie(New SolidBrush(gd.Clr), rect, StartAngle, SweepAngle)

StartAngle += SweepAngle

Next

Вышеуказанный цикл проходит следующим образом: 1.Выбрать следующую компанию в массиве-списке 2.Вычислить, какую часть из 360 градусов он занимает 3.Нарисовать сегмент: • Заполнение сегмента цветом этой компании, • Помещение диаграммы в прямоугольник, • Начало сегмента в правильной точке эллипса, • Продолжение для количества градусов, вычисленных для этой компании 4.Перемещение исходной позиции для следующего сегмента, добавляя количество градусов от текущего сегмента.