class="cite">
Private Sub Command1_Click()
Circle (500, 1000), 10 °Circle (800, 1000), 100
Circle (1100, 1000), 100
Circle (1400, 1000), 100
Circle (1700, 1000), 100
Circle (2000, 1000), 100
Circle (2300, 1000), 100
Circle (2600, 1000), 100
Circle (2900, 1000), 100
End Sub
При вводе этой программы вас будет раздражать необходимость вводить много раз почти одно и то же. Воспользуйтесь копированием, которое объяснено в Приложений.
Мы видим, что здесь Visual Basic 9 раз выполняет один и тот же метод, причем при каждом следующем обращении первый параметр вырастает на 300.
Придумаем для первого параметра переменную величину, например, х. Немного изменим программу:
Private Sub Command2_Click()
х = 500
Circle (x, 1000), 100 х = х + 300
Circle (x, 1000), 100 х = х + 300
Circle (х, 1000), 100 х = х + 300
Circle (х, 1000), 100 х = х + 300
Circle (х, 1000), 100 х = х + 300
Circle (х, 1000), 100 х = х + 300
Circle (х, 1000), 100 х = х + 300
Circle (х, 1000), 100 х = х + 300
Circle (х, 1000), 100 х = х + 300
End Sub
Здесь последний оператор х = х + 300 я написал только для красоты, от него нет никакой пользы, хотя и вреда тоже особого нет.
Эта программа рисует абсолютно то же самое, что и предыдущая, но она проще нее, так как не пришлось самим вычислять координаты.
Что мы видим? Мы видим, что программа состоит из нескольких одинаковых фрагментов. Это прямое приглашение применить цикл:
Dim х As Long
Private Sub Command3_Click()
x = 500
Do Until x > 2900
Circle (x, 1000), 100
x = x + 300
Loop
End Sub
Эта программа тоже рисует абсолютно то же самое, что и две предыдущие, но она короче. Здесь я перестраховался и объявил переменную х, как целую. Иначе при многократном прибавлении 300 могло бы оказаться, что результат равен не 2900, а, скажем, 2900.0000067 (Такой же случай я рассматривал в 0). А это значит, что последняя окружность не была бы нарисована. Можно было бы перестраховаться по-другому: вместо Do Until х > 2900 написать Do Until х > 2901.
Задание 63: Попробуйте уменьшить расстояние между центрами окружностей, не изменяя их радиуса, нарисовав их плотнее, чтобы они пересекались, еще плотнее, пока они не образуют "трубу".
Задание 64:. Удлините трубу налево и направо до краев формы.
Задание 65: Увеличьте толщину трубы.
Заставим окружности вести себя посложнее. Например, расположим их не по горизонтали, а по диагонали формы в направлении от левого верхнего угла в правый нижний. Для этого организуем еще одну переменную — вертикальную координату у — и заставим ее тоже изменяться одновременно с х.
Private Sub Command4_Click()
х = 500 у = 200
Do Until x > 2900
Circle (x, y), 100
x = x + 300
у = у + 200
Loop
End Sub
Если мы захотим менять радиус, то организуем переменную R.
Задание 66: "Очередь трассирующими". Нарисуйте ряд точек по направлению из левого нижнего угла в правый верхний.
Задание 67: "Круги на воде или радиоволны". Нарисуйте пару десятков концентрических окружностей, то есть окружностей разного радиуса, но имеющих общий центр.
Задание 68: "Компакт-диск" и "Летающая тарелка". Если радиус самого маленького "круга на воде" будет порядка 500, а самого большого — во весь экран, и если радиусы соседних окружностей будут различаться на 10–30 твипов, то на экране вы увидите привлекательный "компакт-диск". Сделайте его золотым (Yellow). Если получилось, то сделайте ему внутренний и наружный ободки другого цвета. А теперь "положите" диск, то есть нарисуйте его не из окружностей, а из эллипсов, сжатых по вертикали. Получится "летающая тарелка".
Задание 69: Не трогая х, а меняя только у и R, вы получите "коническую башню".
Задание 70: Меняя все три параметра, вы получите трубу, уходящую в бесконечность.
Задание 71: Разлинуйте экран в линейку.
Задание 72: А теперь в клетку.
Задание 73: А теперь в косую линейку.
Задание 74: Начертите ряд квадратов.
Чтобы получить интересные и сложные рисунки, нужно использовать богатые возможности Visual Basic: вложенные циклы, ветвление внутри цикла и т. д., например:
Задание 75: Нарисуйте шахматную доску.
Помощь: Здесь основные трудности возникнут при раскраске клеток в шахматном порядке. У Волченкова [См. список литературы] я встретил такую идею, касающуюся того, какие клетки закрашивать, а какие нет: Те клетки, у которых сумма номеров строки и столбца четная — закрашивать, остальные — нет.
Задание 76: "Ковер" или "Кольчуга". В задании 62 вы рисовали горизонтальный ряд пересекающихся окружностей. Теперь нарисуйте один под другим много таких рядов.
Указания: Здесь вам понадобятся вложенные циклы. Если центры соседних окружностей отстоят друг от друга на одинаковое расстояние как по горизонтали, так и по вертикали, и если удачно подобраны остальные числа, то у вас получится красивый ковер во весь экран с аккуратными краями.
Задание 77: Пусть у этого ковра будет вырезан левый нижний угол.
Задание 78:… и вдобавок вырезан квадрат посередине.
Использование случайных величин при рисовании
Со случайными числами и функцией Rnd мы с вами познакомились. Попробуем нарисовать "звездное небо". Для этого достаточно покрасить форму в черный или синий цвет и в случайных местах формы нарисовать некоторое количество разноцветных точек (скажем, 1000). Точка ставится методом PSet. Как сделать координаты и цвет точки случайными? Тот же Rnd. Ваша форма имеет размеры WidthxHeight, количество цветов равно 16777216, поэтому обращение к методу рисования одной точки случайного цвета будет выглядеть так:
PSet (Width * Rnd, Height * Rnd), 16777216 * Rnd
Этот оператор нужно просто выполнить 1000 раз:
For i = 1 То 1000
PSet (Width * Rnd, Height * Rnd), 16777216 * Rnd
Next
Результат будет ярче, если точки будут иметь случайную толщину (1 или 2). Имейте в виду, что сколько бы раз вы не запускали программу с указанным фрагментом, картина созвездий на экране будет абсолютно одинакова. Если вам нужно, чтобы