Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Понятно о Visual Basic.NET. Самоучитель.Ч2.2005...docx
Скачиваний:
46
Добавлен:
25.11.2019
Размер:
4.02 Mб
Скачать
      1. Ряд деревьев

Ряд деревьев – 1 версия. Нарисовать ряд деревьев с помощью процедуры Дерево – все равно, что нарисовать ряд окружностей с помощью процедуры DrawEllipse, что мы делали в 8.5. Вот как выглядит процедура, рисующая подходящий ряд из пары десятков деревьев на горизонте:

Sub Ряд_деревьев()

Dim x As Single = 400

Dim y As Single = Уровень_горизонта - 30

Dim i As Integer

For i = 1 To 20

Дерево(x, y, 30)

x = x + 15

Next

End Sub

Числа 400, 30, 30, 15 я подобрал так, чтобы картинка была более-менее похожа на заданную.

Кстати, вы видите, что в нашей программе мы обращаемся из процедуры пользователя Ряд_деревьев к процедуре пользователя Дерево.

Ряд деревьев – 2 версия. На нашем рисунке присутствуют еще два ряда деревьев. Они чем-то похожи, а чем-то непохожи на наш ряд. Нам нужно решить: будем ли мы, когда дело дойдет до их рисования, скромно создавать для них новые процедуры или же прямо сейчас смело сконструируем единую процедуру с такими хитрыми параметрами, чтобы она могла нарисовать любой из трех рядов деревьев на нашем рисунке. Нет ни малейшего сомнения, что мы выбираем второе.

Эта процедура получится небольшим усложнением 1 версии. Попробуем ее переписать так, чтобы получился левый из двух рядов в аллее. Рисовать нужно начинать с самого дальнего дерева, иначе дальние загородят ближних. Если в первой версии у нас от дерева к дереву менялась только горизонтальная координата x, то здесь у нас должны меняться и вертикальная координата y (увеличиваться), и Размер (увеличиваться). Причем, если в 1 версии x рос, то здесь он должен уменьшаться:.

Sub Ряд_деревьев_2_версия()

Dim x As Single = 220

Dim y As Single = Уровень_горизонта - 30

Dim Размер As Single = 30

Dim i As Integer

For i = 1 To 20

Дерево(x, y, Размер)

x = x - 22

y = y + 20

Размер = Размер + 10

Next

End Sub

Временно допишите в процедуру рисования вызов этой процедуры и проверьте, как она работает. Есть ли у вас уверенность, что меняя только числа в процедуре, вы сможете рисовать любые нужные на рисунке ряды деревьев? У меня есть. Действительно, ряд деревьев на горизонте получается при помощи этой процедуры изменением четырех чисел в следующих строках:

Dim x As Single = 400

x = x + 15

y = y + 0

Размер = Размер + 0

А раз так, то пора числа и переменные превращать в параметры.

Ряд деревьев – окончательная версия. Посмотрим, от каких переменных и чисел зависит вид ряда деревьев. Начнем просматривать нашу процедуру сверху вниз:

Dim x As Single = 220

Dim y As Single = Уровень_горизонта - 30

Dim Размер As Single = 30

Эти три строки определяют положение и размер самого первого дерева ряда. Конечно же, все три переменные должны стать параметрами.

For i = 1 To 20

Эта строка задает число деревьев в ряду. Конечно, мы захотим иметь возможность рисовать ряды с разным числом деревьев. Число 20 превращаем в параметр.

x = x - 22

y = y + 20

Размер = Размер + 10

Три числа: -22, 20, 10 определяют направление ряда деревьев, расстояние между деревьями и увеличение размеров от дерева к дереву. Без них не обойтись. Еще три параметра.

Итого 7 параметров. Все они нужны, ничего не попишешь. Превращаем нашу процедуру в процедуру с параметрами:

Sub Ряд_деревьев(ByVal x As Single, ByVal y As Single, ByVal Размер As Single, ByVal Число_деревьев _

As Integer, ByVal Шаг_по_гориз As Single, ByVal Шаг_по_вертик As Single, ByVal Увеличение As Single)

Dim i As Integer

For i = 1 To Число_деревьев

Дерево(x, y, Размер)

x = x + Шаг_по_гориз

y = y + Шаг_по_вертик

Размер = Размер + Увеличение

Next

End Sub

Вы спросите: почему в строках

x = x + Шаг_по_гориз

y = y + Шаг_по_вертик

стоят плюсы, ведь часто там должны быть и минусы? Отвечаю: Плюсы трогать не будем, а нужного результата будем добиваться отрицательным значением шага. Например, вот как будет выглядеть вызов процедуры для рисования левого из двух рядов в аллее:

Ряд_деревьев (220, Уровень_горизонта - 30, 30, 20, -22, 20, 10)

А вот как – для ряда деревьев на горизонте:

Ряд_деревьев (400, Уровень_горизонта - 30, 30, 20, 15, 0, 0)

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