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

Используем в рисовании переменные величины


Я уже потихоньку использовал в рисовании переменные величины, но без особых пояснений, и, главное, в недостаточной степени. Переменные должны почти полностью вытеснить числа из текста программ, это неизбежно.

Если вы нарисовали человечка и паровоз, то наверное согласитесь, что для этого вам пришлось основательно потрудиться, хотя сам рисунок получился не слишком сложным, в нем всего-то порядка двух десятков элементов.

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

Задача: Нарисовать горизонтальный ряд окружностей диаметром 20 на расстоянии 100 от верхнего края формы и с такими горизонтальными координатами 50, 80, 110, 140, ¼ , 290.

 
  
  
  
  
  
  
  

Как видим, центры соседних окружностей отстоят друг от друга на 30.  Вот примитивный фрагмент, решающий эту задачу:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim Граф As Graphics = Me.CreateGraphics

        Граф.DrawEllipse(Pens.Black, 50, 100, 20, 20)

        Граф.DrawEllipse(Pens.Black, 80, 100, 20, 20)

        Граф.DrawEllipse(Pens.Black, 110, 100, 20, 20)

        Граф.DrawEllipse(Pens.Black, 140, 100, 20, 20)

        Граф.DrawEllipse(Pens.Black, 170, 100, 20, 20)



        Граф.DrawEllipse(Pens.Black, 200, 100, 20, 20)

        Граф.DrawEllipse(Pens.Black, 230, 100, 20, 20)

        Граф.DrawEllipse(Pens.Black, 260, 100, 20, 20)

        Граф.DrawEllipse(Pens.Black, 290, 100, 20, 20)

End Sub

При вводе этой программы вас будет раздражать необходимость вводить много раз почти одно и то же. Воспользуйтесь копированием, которое объяснено в Приложении 2.

Мы видим, что здесь VB 9 раз выполняет один и тот же метод DrawEllipse, причем при каждом следующем обращении второй параметр метода вырастает на 30.

Придумаем для этого параметра переменную величину, например, х. Немного изменим программу:


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim Граф As Graphics = Me.CreateGraphics
        Dim x As Integer = 50
        Граф.DrawEllipse(Pens.Black, x, 100, 20, 20) : x = x + 30
        Граф.DrawEllipse(Pens.Black, x, 100, 20, 20) : x = x + 30
        Граф.DrawEllipse(Pens.Black, x, 100, 20, 20) : x = x + 30
        Граф.DrawEllipse(Pens.Black, x, 100, 20, 20) : x = x + 30
        Граф.DrawEllipse(Pens.Black, x, 100, 20, 20) : x = x + 30
        Граф.DrawEllipse(Pens.Black, x, 100, 20, 20) : x = x + 30
        Граф.DrawEllipse(Pens.Black, x, 100, 20, 20) : x = x + 30
        Граф.DrawEllipse(Pens.Black, x, 100, 20, 20) : x = x + 30
        Граф.DrawEllipse(Pens.Black, x, 100, 20, 20) : x = x + 30
End Sub
В последней строке оператор x = x + 30   я написал только для красоты, от него в ней нет никакой пользы, хотя и вреда тоже особого нет.
Эта программа рисует абсолютно то же самое, что и предыдущая, но она проще нее, так как не пришлось самим вычислять координаты.
Что мы видим? Мы видим, что программа состоит из 9 совершенно одинаковых фрагментов. Это прямое приглашение применить цикл:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim Граф As Graphics = Me.CreateGraphics
        Dim x As Integer= 50
        Do Until x > 290
            Граф.DrawEllipse(Pens.Black, x, 100, 20, 20) : x = x + 30
        Loop
End Sub
Эта программа также рисует абсолютно то же самое, что и две предыдущие, но она существенно короче. Здесь я объявил переменную x, как целую. Иначе при многократном прибавлении 30 могло бы оказаться, что результат равен не 290, а, скажем, 290.0000067 (Такой же случай я рассматривал в 8.2). А это значит, что последняя окружность не была бы нарисована. Можно было бы перестраховаться по-другому: вместо  Do Until x > 290  написать  Do Until x > 291.
Кое-чему мы научились. Когда у вас возникнут проблемы с использованием переменных величин в графических (и не только графических) задачах, постарайтесь пройти по ступенькам, по которым только-что прошел я: от чисел – к одинаковым фрагментам, а от них – к циклу.


Задание 39.        
«Труба». А. Попробуйте уменьшить расстояние между центрами окружностей, не изменяя их радиуса, нарисовав их плотнее, чтобы они пересекались, еще плотнее, пока они не образуют «трубу».
Б. Удлините трубу налево и направо до краев формы.
В. Увеличьте толщину трубы.
Ряд окружностей наискосок. Заставим окружности вести себя посложнее. Например, расположим их не по горизонтали, а примерно по диагонали формы в направлении от левого верхнего угла вправо вниз.
Начнем с первой ступеньки:
        Граф.DrawEllipse(Pens.Black, 0, 0, 20, 20)
        Граф.DrawEllipse(Pens.Black, 30, 20, 20, 20)
        Граф.DrawEllipse(Pens.Black, 60, 40, 20, 20)
        Граф.DrawEllipse(Pens.Black, 90, 60, 20, 20)
На второй ступеньке организуем две переменные: горизонтальную координату x и вертикальную координату у – и заставим их изменяться:
        x = 0
        y = 0
        Граф.DrawEllipse(Pens.Black, x, y, 20, 20)   :     x = x + 30  :   y = y + 20
        Граф.DrawEllipse(Pens.Black, x, y, 20, 20)   :     x = x + 30  :   y = y + 20
И наконец мы на последней ступеньке:
       Dim x, y As Integer
        x = 0
        y = 0
        Do Until x > 290
            Граф.DrawEllipse(Pens.Black, x, y, 20, 20)
            x = x + 30
            y = y + 20
       Loop
Задания. Теперь вы достаточно подготовлены для того, чтобы выполнить следующие задания:
Задание 40.        
«Две очереди трассирующими ночью». Мы «перечеркнули» форму окружностями наискосок из левого верхнего угла приблизительно в правый нижний. Пусть теперь это будут очень маленькие кружочки на черной форме. Получилась «очередь трассирующими». Вслед за этим перечеркните форму очередью также и из левого нижнего угла, чтобы на экране получились две пересекающиеся очереди.
Задание 41.        
Нарисуйте «трубу» наискосок. Получилось? Теперь попробуйте вместе с координатами x и у менять также и диаметр окружности. Если вы будете понемножку его увеличивать, начиная с 0, то получите «трубопровод», уходящий в бесконечность.
Задание 42.        
Начертите ряд квадратов. Получилось? Теперь сделайте «квадратный трубопровод».
Задание 43.        
А. Разлинуйте экран в линейку.
Б. А теперь в клетку.
В. А теперь в косую линейку.

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