ПОНЯТНО О Visual Basic NET (том 2)

Ряд деревьев


Ряд деревьев – 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)
У процедуры есть недостаток: расстояния между соседними деревьями вдали и вблизи одинаковы, что не соответствует законам перспективы. Вы можете исправить это положение, сделав шаги зависящими от размера.

Содержание раздела