Лабораторная работа № 3 (2 часа)




 

Тема занятия: Рисование графиков и диаграмм графическими методами

Рисование диаграмм

Метод Circle можно использовать для рисования круговых диаграмм. Эти диаграммы наглядно показывают долю чего-нибудь в общем количестве. На круговой диаграмме угловой размер соответствующего сектора и определяет долю от общего числа, которое принимается за единицу, или 100%.

 

Упражнение 1.

Допустим, что на промежуточной аттестации знаний по одному из предметов студенты курса показали следующие результаты: 5% получили оценку «отлично», 17% – «хорошо», 36% – «удовлетворительно», остальные 42% – «плохо» либо были не аттестованы. Обратите внимание, что сумма всех показателей должна составлять 100%.

1. Создать новое приложение, в нем создать форму c именем Form 1 и заголовком. «Результаты успеваемости».

2. На форме создать четыре маленьких графических поля для условных обозначений с одним именем Picture 1 (массив объектов) и одно большое для вывода результатов Picture 2 ( рис.21 ).

3. Создать командную кнопку с именем Command 1.

4. В окне свойств массиву объектов Picture 1 свойству Index присвоить значения с 1 до 4. Таким образом, имена графических полей будут Picture 1(1), Picture 1(2) и т.д. Это избавит вас от написания одинакового кода для четырех объектов.

5. Написать процедуру для прорисовки сектора, где StartSec, EndSec – углы, ограничивающие сектор:

 

Sub Sector(StartSec, EndSec)

Picture2.Circle (0, 0), 0.8,, StartSec, EndSec

End Sub

 

6. Написать процедуру рисования «условных обозначений».

 

Sub UslObozn(Num As Integer, Znach As Single)

Picture1(Num).Line (1, -1)-(-1, 0.2), vbWhite, B

Picture1(Num).PSet (-1.1, 1)

Picture1(Num).Print Znach; "%"

End Sub

 

7. Для командной кнопки процедура будет следующей:

 

Private Sub Command1_Click()

Dim i As Integer

Dim mark(4) As Single

Const Pi = 3.1415

‘Присвоение значений

mark(1) = 5

mark(2) = 17

mark(3) = 36

mark(4) = 42

‘Масштабирование полей

For index = 1 To 4

Picture1(index).Scale (-1, 1)-(1, -1)

Next

Picture2.Scale (-1, 1)-(1, -1)

‘Вывод условных обозначений

For i = 1 To 4

Picture1(i).FillStyle = 3 + i

Call UslObozn(i, mark(i))

Next

‘Рисование четырех секторов

a2 = -0.00001

For i = 1 To 4

Picture2.FillStyle = 3 + i

a1 = a2: a2 = a1 - 2 * Pi * mark(i) / 100

Call Sector(a1, a2)

Next

 

End Sub

8. Запустите приложение. Щелкните по командной кнопке. На рис. 22 приведена экранная форма с круговой диаграммой, которая даёт наглядное представление об успеваемости.

 

 

В проделанном упражнении уже даны доли (проценты) каждой части, пропорционально которым строится каждый сектор диаграммы. Если даны абсолютные величины, то требуется предварительно пересчитать их, приняв сумму абсолютных значений за единицу.

Например, задача сформулирована следующим образом. Из 25 человек оценку «5» получили 2 человека, «4» - 4 человека, «3» - 10, остальные – неудовлетворительную оценку. Тогда, переменные mark (i) будут равны:

 

mark(1) = 2/25*100

mark(2) = 4/25*100

mark(3) = 10/25*100

mark(4) = 9/25*100

 

Рисование кривых

Методы Line и Circle позволяют рисовать гистограммы и секторные диаграммы. А как нарисовать график сложной математической функции? Для рисования кривой необходим программный код, который рисует каждую ее точку. Разумеется, рисовать кривые не так просто, как рисовать линии, но средства VB позволяет решить и эту задачу.

В общем случае функция одного аргумента задается в виде F(x). Чтобы график функции целиком был виден на экране (или в окне определенного размера) необходимо, используя метод Scale, задать пользовательский масштаб, связанный с параметрами функции (диапазоном изменения аргумента и максимальным и минимальным значением функции).

Пусть аргумент функции x изменяется в диапазоне от Xmin до Xmax. Следовательно, по оси необходимо установить пользовательский режим задания координат в диапазоне от Xmin до Xmax.

Чтобы построить график функции, необходимо рассчитать ее значения при последовательных значениях x и отложить по оси ординат точки, соответствующие этим значениям, то есть, чтобы сформировать координатное пространство функции, необходимо рассчитать максимальное и минимальное значения функции в диапазоне изменения переменной x. Очевиден вопрос, сколько же точек по оси абсцисс необходимо включить в расчет. Чтобы график функции не имел разрывов, расчет значений функции необходимо вести для каждого пикселя, лежащего в диапазоне изменений x, т.е. нужно сопоставить каждый пиксель с соответствующими значениями переменной x.

Пусть число пикселей по оси абсцисс равно XPixels. Таким образом, чтобы решить задачу построения графика необходимо:

1. Определить Pixels.

2. Значение x, соответствующее каждому пикселю рассматриваемого диапазона.

3. Максимальное и минимальное значение функции.

4. Построить пользовательскую систему координат.

5. Для определения величины XPixels необходимо временно установить значение свойства ScaleMode =3(Pixels), с помощью свойства ScaleWidth определить разрешающую способность элемента по горизонтали, а затем установить пользовательскую систему координат, соответствующую графику.

 

Form1.ScaleMode=3

XPixels=Form1.ScaleWidth-1

 

6. Определить значения x, соответствующего каждому пикселю. Ниже приведен цикл сканирования пикселей по оси х и расчет значений х:

 

For i = 1 To XPixels

x = Xmin + (Xmax - Xmin) * i / XPixels

Next

 

7. Далее остается рассчитать значения функции для каждого значения переменной x. Значения отображаемой функции вычисляются следующим образом:

 

Function Fun(ByVal x As Double) As Double

Fun = Fn(x)

End Function

 

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

 

For i = 1 To XPixels

x = Xmin + (Xmax - Xmin) * i / XPixels

Y = Fun(x)

If Ymax < Y Then Ymax = Y

If Ymin > Y Then Ymin = Y

Next i

 

9. Чтобы установить систему координат конкретной функции, можно вызвать метод Scale с аргументами.

 

Form1.Scale (Xmin, YMin) – (Xmax, YMax)

 

10. Для построения графика функции модифицируем цикл нахождения значения x:

 

For i = 1 To XPixels

x = Xmin + (Xmax - Xmin) * i / XPixels

Pset (x, Fn(x))

Next

 

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

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

Упражнение 2.

Нарисовать график функции Y = exp (2/ t) sin (4 t) в интервале значений t от 1 до 10.

1. Создайте новый проект и присвойте ему имя «Построение графика».

2. Установите на форму графическое окно и две командные кнопки. В режиме конструирования форма будет иметь следующий вид (рис.23).

3.
Щелкните дважды по командной кнопке «Нарисовать график» и в программное окно введите следующий код:

 

Dim Y, t As Variant

Dim Xmin, Xmax, Ymin, Ymax As Variant

Dim i As Integer

Dim XPixels As Integer

'Диапазон изменения х

Xmin = 2

Xmax = 10

'Задание максимальных и минимальных констант

Ymax = -1E101

Ymin = 1E101

'Определение значение XPixels

XPixels = Picture1.ScaleWidth - 1

'Определение максимального и минимального значения функции

For i = 1 To XPixels

t = Xmin + (Xmax - Xmin) * i / XPixels

Y = Fun(t)

If Ymax < Y Then Ymax = Y

If Ymin > Y Then Ymin = Y

Next i

'Установка пользовательской системы координат

Picture1.Scale (Xmin, Ymin)-(Xmax, Ymax)

Picture1.ForeColor = RGB(255, 0, 0)

'Построение графика

For i = 1 To XPixels

t = Xmin + (Xmax - Xmin) * i / XPixels

Picture1.PSet (t, Fun(t))

‘Picture1.Line -(t, Fun(t))

Next

 

4. В проект добавьте процедуру определения функции:

 

Function Fun (ByVal x As Double) As Double

Fun = Exp(x / 2) * (Sin(4* x))

End Function

 

5. Щелкните дважды по кнопке «Выход» и в процедуру для данной кнопкизапишите:

 

End

 

6. Сохраните проект.

7. Запустите приложение на исполнение. Нажмите кнопку «Нарисовать график». На экране появится изображение графика в графическом окне PictureBox. ( рис.24 ). Недостатки кода проявляются в разрывах между соседними точками функции. Чтобы скрыть разрывы, можно заменить метод Pset, устанавливающий один пиксель, методом Line, рисующим сегмент линии между двумя соседними точками:

 

 
 

Picture1.Line – (t, Fun(t))

 

8. В нашем случае этот вариант кода отмечен знаком комментария (‘), поскольку исходный вариант дает приемлемый вид графика.

9. Закройте проект, нажав кнопку «Выход». Сохраните проект.

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-07-22 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: