Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Часть_1.doc
Скачиваний:
21
Добавлен:
20.04.2015
Размер:
462.85 Кб
Скачать

6. Графика

6.1. Воспроизведение цвета

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

Цвета закодированы. Имеется три варианта кодировки и, соответственно, три способа воспроизведения цвета.

Первый способ – указание цвета из основной палитры.

Таблица 6.1. Основная палитра.

N

Цвет

Кодовое имя

1

Черный

vbBlack

2

Красный

vbRed

3

Зеленый

vbGreen

4

Синий

vbBlue

5

Голубой

vbCyan

6

Фиолетовый

vbMagenta

7

Желтый

vbYellow

8

Белый

vbWhite

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

Второй способ – смешивание красок с помощью функции RGB (по первым буквам названий из основной палитры). Функция эта имеет вид RGB(c1, c2, c3), где в скобках указываются три числа, устанавливающие пропорции красного, зеленого и синего циетов.

Каждое из чисел (c1, c2, c3) имеет предел от 0 до 255. Если все числа поставить одинаковые, то цвет будет одного из серых оттенков. Если все они равны нулю – цвет черный, а если 255 – цвет белый.

Третий способ – просто число от 0 до 16 777 215.

Например, цвет фона на форме можно задать так:

Form1.BackColor= vbBlue

Form1.BackColor= RGB(200, 57, 129)

Form1.BackColor= 17254.

Способ задания цвета выбирается в зависимости от потребностей графики.

6.2. Операторы (Методы) изображения стандартных фигур

Стандартными фигурами являются точка, прямая линия, прямоугольник и окружность. Для изображения точки служит метод PSET (от слов point set – поставить точку). Этот оператор имеют следующий формат:

PSET [step] (x, y), c

Параметры x, y – это координаты точки в твипах. Параметр step означает, что координаты x, y относительные, то есть отсчитываются от координат предыдущей фиксированной точки. Если он отсутствует, координаты абсолютные – отсчитываются от точки с координатами (0,0), то есть от левого верхнего угла экрана. Параметр c означает цвет. Он может быть не указан. Тогда оператор PSET ставит точку цветом, определенным предыдущим оператором. А если такого нет, то точка будет черной.

Прямая линия изображается методом LINE [step] (x1, y1) - [step] (x2, y2), c.

Параметры (x1, y1) и (x2, y2) являются соответственно координатами начальной и конечной точек прямой. Параметр c также означает цвет. Параметр step имеет тот же смысл, что и раньше. Координаты (x1, y1) могут быть не указаны. Тогда в качестве начальной точки принимается точка, зафиксированная предыдущим оператором. Это используется при построении кривых по точкам.

Если после параметра цвета через запятую поставить символ B, метод LINE нарисует прямоугольник: LINE [step] (x1, y1) - [step] (x2, y2), c, B(F).

Левый верхний угол прямоугольника находится в точке (x1, y1), а правый нижний угол – в точке (x2, y2). Если же вместо символа B поставить BF, то прямоугольник будет закрашен цветов c.

Окружность изображается методом CIRCLE со следующими параметрами:

CIRCLE [step] (x, y), r, c, s, f, k.

Параметр step имеет то же значение, что и выше. Параметры (x, y) являются координатами центра окружности; r – ее радиус в пикселах; c - цвет; s и f – соответственно начало и конец окружности в радианах; k – коэффициент сжатия, позволяющий нарисовать эллипс. Здесь любой параметр, кроме радиуса, может быть опущен.

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

Ещё один полезный метод называется Point(x,y). Это функция, которая определяет цвет точки с координатами (x,y), расположенной на экране (форме).

Ниже приведены основные свойства объектов, связанные с окраской.

DrawWidth – толщина линий.

ForeColor - цвет линий ( и текста).

BackColor - цвет фона.

FillColor – цвет заливки стандартной фигуры.

FillStyle – стиль заливки: VBSolid – сплошная.

Вспомним, что в общем виде формат оператора выглядит так:

Объект. Свойство = Значение

Это относится и к операторам окраски.

Следующие ниже примеры иллюстрируют изображение стандартных фигур.

Пример 6.1. Геометрическая задача.

С помощью датчика случайных чисел генерируются координаты n точек в заданных пределах x1, x2, y1, y2. Таким образом, все точки попадают в прямоугольник соответствующего размера. Заданы координаты центра и радиус некоторой окружности. Требуется подсчитать число точек, попавших внутрь окружности. Признак попадания: расстояние между точкой и центром окружности меньше ее радиуса. Требуется изобразить на экране соответствующий рисунок.

Программа включает три подпрограммы со следующими функциями: генерация координат точек, подсчет числа точек в окружности, изображение на экране.

Private Sub Command1_Click()

'Пример 6_1

'Список подпрограмм

'SUB gen (x1, x2, y1, y2, x(), y(), n)

'SUB calcule (xc, yc, r, x(), y(), n, calc)

'SUB pnt (x(), y(), n, xc, yc, r, calc, x1, y1, x2, y2)

xc = 3000: yc = 2400: r = 1000 'Координаты и радиус окружности

x1 = 1000: x2 = 4500: y1 = 1000: y2 = 4000 'Координаты прямоугольника

n = InputBox("Задайте число точек")

calc = 0 'Счетчик точек, попавших в окружность

gen x1, x2, y1, y2, x, y, n 'Генерация координат точек

Call calcule(xc, yc, r, x, y, n, calc) 'Расчет числа точек в окружности

Call pnt(x, y, n, xc, yc, r, calc, x1, y1, x2, y2) 'Рисунок

End Sub

Private Sub calcule(xc, yc, r, x, y, n, calc)

For i = 1 To n

If Sqr((x(i) - xc) ^ 2 + (y(i) - yc) ^ 2) < r Then calc = calc + 1

' Проверка условия попадания точки в окружность

Next i

Print "calcule"

End Sub

Private Sub gen(x1, x2, y1, y2, x, y, n)

For i = 1 To n

x(i) = x1 + (x2 - x1) * Rnd 'RND – функция для генерации

y(i) = y1 + (y2 - y1) * Rnd 'случайных чисел в пределах (0-1)

Next i

Print "gen"

End Sub

Private Sub pnt(x, y, n, xc, yc, r, calc, x1, y1, x2, y2)

Form1.BackColor = RGB(100, 100, 100)

'Form1.BackColor = vbBlue 'Фон окрашен синим

Form1.CurrentX = 50

Form1.CurrentY = 50

Print "number of points: "; calc 'Вывод на форму числа точек в окружности

Line (0, 3000)-(5000, 3000), vbRed ' Рисунок оси x

Line (2500, 0)-(2500, 5000), vbRed ' Рисунок оси y

Form1.CurrentX = 4900

Form1.CurrentY = 2700

Print "x" 'Обозначение оси x

Form1.CurrentX = 2600

Form1.CurrentY = 200

Print "y" ' Обозначение оси y

Line (x1, y1)-(x2, y2), , B 'Рисунок прямоугольника

Circle (xc, yc), r, vbGreen 'Рисунок окружности

For i = 1 To n

PSet (x(i), y(i)), vbYellow 'Рисунок точки

Next i

End Sub

Пример 6.2. Построение графика функции.

Программа для построения графика произвольной функции должна учитывать минимальное и максимальное значение как аргумента, так и функции. В приведенной программе строится график функции y(x)=0.01xsin(x) в пределах -5<x<10. Таким образом, минимальное и максимальное значение x определено последним неравенством. При этом функция y(x) меняется в пределах от –0.1 до +0.1. Программа вычисляет n точек и проводит линии между смежными точками. В связи с указанными пределами по x и y требуется введение масштабных множителей и пересчет (сдвиг) начала координат, так как отрицательные значения не имеют смысла при определении координат точки на форме.

Эти операции присутствуют в приведенном примере программы. Заблокированные строки использовались при отладке

Private Sub Command1_Click()

'Пример 6_2 Построение графика функции

Dim x(500) As Integer: Dim y(500) As Single

Dim xm(500) As Integer: Dim ym(500) As Single

Dim Mx As Integer: Dim My As Integer

n = 30 'Количество точек

x(1) = -10: dx = 30 / n: y(1) = fny(x(1)) 'Задана начальная точка и интервал по x.

My = InputBox("Масштаб по вертикали (70-125) My=")

Form1.CurrentX = 50 ‘Установлена начальная точка отсчета координат рисунка

Form1.CurrentY = 50

For i = 2 To n

x(i) = (x(i - 1) + dx) 'Вычисляются значения аргумента

y(i) = -fny(x(i)) 'и функции

'Print x(i), y(i)

Next i

Mx = 5000 / 30

'Print "======="; x(1)

For i = 1 To n

'Print i, x(i), y(i)

xm(i) = (x(i) - x(1)) * Mx + 100 ' Вычисляются масштабированные значения аргумента

ym(i) = y(i) * My + 3000 ' и функции

'Print xm(i); ym(i)

Next i

PSet (x(10), y(10)), vbGreen

'Form1.BackColor = RGB(100, 100, 100)

Form1.BackColor = vbBlue 'Фон окрашен синим

Line (100, 3000)-(5100, 3000), vbRed ' Рисунок оси x

Line (1770, 0)-(1770, 6000), vbRed ' Рисунок оси y

Form1.CurrentX = 5000

Form1.CurrentY = 2700

ForeColor = vbWhite

Print "x" 'Обозначение оси x

Form1.CurrentX = 2000

Form1.CurrentY = 200

Print "y" ' Обозначение оси y

For i = 1 To n - 1

If y(i) = 0 Then

Circle (xm(i), ym(i)), 50, vbBlack ' Определяется начало координат на рисунке,

'Print xm(i), ym(i) ‘чтобы подставить в рисунок оси y

End If

Line (xm(i), ym(i))-(xm(i + 1), ym(i + 1)), vbYellow

Next i

End Sub

Private Function fny(z)

fny = z * Sin(z)

End Function

Пример 6.3. Рисунок четырёх фигур.

Треугольник рисуется из начальной точки с координатами (x=2500, y=200). Внутри он не окрашивается, так как не является стандартной фигурой.

Private Sub Command1_Click()

'Пример 6_3 Окружность, линия, прямоугольник, треугольник

'Form1.BackColor = RGB(100, 100, 100) 'Цвет формы серый

Form1.BackColor = vbBlue 'Цвет формы синий

ForeColor = vbRed ‘Цвет линий

FillStyle = vbSolid ‘Стиль заливки

FillColor = vbYellow ‘Цвет заливки

DrawWidth = 7 ‘Толщина линий

Line (2530, 170)-(1030, 3030) ‘Это треугольник

Line (970, 3000)-(5030, 3000)

Line (5030, 3030)-(2470, 170)

ForeColor = vbGreen

FillStyle = vbSolid

FillColor = vbYellow

Line (3700, 6000)-(5500, 3500), , B ‘Это прямоугольник

'FillColor = RGB(220, 220, 220)

FillColor = vbMagenta

DrawWidth = 5

ForeColor = vbYellow

Circle (1000, 5000), 250 ', vbBlack

PSet (1000, 5000), vbBlack

Line (1000, 6000)-(3000, 6700), vbGreen

End Sub

Пример 6.4. Стандартные фигуры, прямоугольник внутри круга. Сканирование заданной области внутри круга с целью перекрашивания прямоугольника.

Private Sub Command1_Click()

'Пример 6_4

Dim i As Integer: Dim x As Integer: Dim y As Integer

Form1.BackColor = vbBlue 'Синий фон

DrawWidth = 3

Circle (1000, 5000), 250 ', vbBlack - маленький круг для ориентировки на форме

ForeColor = vbRed ‘Цвет линий

FillStyle = vbSolid ‘Сплошная заливка фигуры

FillColor = vbYellow ‘Цвет заливки желтый

Circle (4500, 5500), 3000 ‘Рисунок окружности

ForeColor = vbGreen

FillStyle = vbSolid

FillColor = vbWhite

Line (3700, 3500)-(5500, 6000), , B ‘ Прямоугольник, белый внутри

'PSet (3000, 3000) 'Пробная точка для определения координат

'PSet (6000, 3000)

'PSet (3000, 7000)

'FillColor = RGB(220, 220, 220) ‘Серая заливка

'DrawWidth = 5 ‘Толщина линий

i = 1

For x = 3000 To 6000 Step 40

For y = 3000 To 7000 Step 40

If i < 8 Then i = i + 1 Else i = 1

R = i * 40

'Меняется цвет точки, если она не желтая (65535),

'то есть находится внутри прямоугольника

'If Point(x, y) <> 65535 Then PSet (x, y), vbRed

'If Point(x, y) <> 65535 Then PSet (x, y), y

If Point(x, y) <> 65535 Then PSet (x, y), RGB(i * 2, (8 - i) * 30, R)

Next y

Next x

Print "====================="

End Sub