Решение задачи распознавания образов — ключ к осуществлению величайшей и самой дерзкой мечты ученых — созданию искусственного интеллекта, электронного разума, равного человеческому или превосходящего его.
Метод PaintPicture
Задача: В объекты Picture1 и Picture2 загружены картинки. Взять прямоугольный кусок из картинки в Picture2 и вставить, немного сжав, в определенное место картинки в Picture1.
Решение: Дело решает одна строка:
Picture1. PaintPicture Piсturе2.Picture, 500, 100, 600, 800, 4500, 1000, 900, 1200
Словесное описание этой строки: В объект Picture1 вставить фрагмент из Picture2.Picture, причем левый верхний угол исходного изображения имеет координаты (4500, 1000), его ширина — 900, высота — 1200. Левый верхний угол результирующего изображения имеет координаты (500, 100), его ширина — 600, высота — 800.
Объектом может служить форма и PictureBox.
Используем в рисовании переменные величины
Если вы нарисовали снеговика, то наверное согласитесь, что для этого вам пришлось основательно потрудиться, хотя сам рисунок получился не слишком богатый, в нем всего-то порядка десяти элементов.
Как заставить Visual Basic короткой программой рисовать множество элементов, сплетая их в красивые узоры? Ответ: применять циклы, используя в обращениях к графическим методам вместо чисел переменные величины и арифметические выражения.
Задача: Нарисовать горизонтальный ряд окружностей радиусом 100 на расстоянии 1000 от верхнего края экрана и с такими горизонтальными координатами 500, 800, 1100, 1400…, 2900.
Как видим, центры соседних окружностей отстоят друг от друга на 300. Вот примитивный фрагмент, решающий эту задачу:
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: "Очередь трассирующими". Нарисуйте ряд точек по направлению из левого нижнего угла в правый верхний.