![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Используем в рисовании переменные величиныСодержание книги
Поиск на нашем сайте
Если вы нарисовали снеговика, то наверное согласитесь, что для этого вам пришлось основательно потрудиться, хотя сам рисунок не слишком богат, в нем всего порядка десяти элементов. Как заставить Паскаль короткой программой рисовать множество элементов? Ответ: применять циклы, используя в обращениях к графическим процедурам вместо чисел переменные величиныи арифметические выражения. Задача: Нарисовать горизонтальный ряд окружностей радиусом 10 на расстоянии 100 от верхнего края экрана и с такими горизонтальными координатами 50, 80, 110, 140, ¼, 290. Как видим, центры соседних окружностей отстоят друг от друга на 30. Вот примитивный фрагмент, решающий эту задачу: Circle(50,100,10); Circle(80,100,10); Circle(110,100,10); Circle(140,100,10); Circle(170,100,10); Circle(200,100,10); Circle(230,100,10); Circle(260,100,10); Circle(290,100,10); При вводе этой программы вас будет раздражать необходимость вводить много раз почти одно и то же. Воспользуйтесь копированием, которое объяснено в параграфе «Копирование и перемещение фрагментов текста» из части IV. Мы видим, что здесь Паскаль 9 раз выполнит одну и ту же процедуру, причем при каждом следующем обращении первый параметр вырастает на 30. А теперь решим эту же задачу при помощи цикла. Придумаем для первого параметра переменную величину, например, х. Чтобы х изменялся, организуем цикл repeat. Вот программа решения задачи: USES Graph; VAR x, Device, Mode:Integer; BEGIN InitGraph(Device, Mode, ’< путь к графическим драйверам> ’); x:=50; repeat x:=x+30; until x>290; CloseGraph END. Задание 69:. Попробуйте уменьшить расстояние между центрами окружностей, не изменяя их радиуса, нарисовав их плотнее, чтобы они пересекались, еще плотнее, пока они не образуют “трубу”. Задание 70:. Удлините трубу налево и направо до краев экрана. Задание 71:. Увеличьте толщину трубы.
Заставим окружности вести себя посложнее. Например, расположим их не по горизонтали, а по диагонали экрана в направлении от левого верхнего угла в правый нижний. Для этого организуем еще одну переменную - вертикальную координату у - и заставим ее тоже изменяться одновременно с x. USES Graph; VAR x, y, Device, Mode: Integer; BEGIN InitGraph(Device, Mode, ’< путь к графическим драйверам> ’); x:=50; y:=20; repeat x:=x+30; y:=y+20; until x>290; CloseGraph END. Если мы захотим менять радиус, то организуем переменную R, тоже типа Integer.
Задание 72:. Нарисуйте ряд точек по направлению из левого нижнего угла в правый верхний. Задание 73:. “Круги на воде”. Нарисуйте пару десятков концентрических окружностей, то есть окружностей разного радиуса, но имеющих общий центр. Задание 74:. “Компакт-диск”. Если радиус самого маленького “круга на воде” будет порядка 50, а самого большого - во весь экран, и если радиусы соседних окружностей будут различаться на 2-3 пиксела, то на экране вы увидете привлекательный “компакт-диск”. Сделайте его золотым (Yellow). Задание 75:. Не трогая x, а меняя только yи R, вы получите коническую башню. Задание 76:. Меняя все три параметра, вы получите трубу, уходящую в бесконечность. Задание 77:. Разлинуйте экран в линейку. Задание 78:. А теперь в клетку. Задание 79:. А теперь в косую линейку. Задание 80:. Начертите ряд квадратов.
Чтобы получить богатые рисунки, нужно использовать богатые возможности Паскаля: вложенные циклы, ветвление внутри цикла и т.д., например: Задание 81:. Нарисуйте шахматную доску. Задание 82:. “Ковер”. В задании 69 вы рисовали горизонтальный ряд пересекающихся окружностей. Теперь нарисуйте один под другим много таких рядов. Указания: Здесь вам понадобятся вложенные циклы. Если центры соседних окружностей отстоят друг от друга на одинаковое расстояние что по горизонтали, что по вертикали, и если удачно подобраны остальные числа, то у вас получится красивый ковер во весь экран с аккуратными краями. Задание 83:. Пусть у этого ковра будет вырезан левый нижний угол. Задание 84:. ¼ и вдобавок вырезан квадрат посередине. Использование случайных величинпри рисовании Как получить случайное число? Давайте сначала напечатаем его. Для этого подойдет функция Randomиз 4.9. WriteLn(Random(100)) напечатает целое неотрицательное число, какое - мы заранее не знаем, знаем только, что меньше 100. Легко догадаться, что WriteLn (500 + Random(100)) напечатает случайное число из диапазона от 500 до 599. Попробуем нарисовать “звездное небо”. Для этого достаточно в случайных местах экрана нарисовать некоторое количество разноцветных точек (скажем, 1000). Точка ставится процедурой PutPixel. Как сделать координаты и цвет точки случайными? Тот же Random. Если ваш экран имеет размер 640´480 пикселов, то обращение к процедуре рисования одной точки случайного цвета будет выглядеть так:
PutPixel (Random(640), Random(480), Random(16)) Число 16 взято по той причине, что все цвета в Паскале имеют номера от 0 до 15. Для того, чтобы таких точек было 1000, используем цикл for: for i:=1 to 1000 do PutPixel (Random(640), Random(480), Random(16)) Имейте в виду, что сколько бы раз вы не запускали программу с указанным фрагментом, картина созвездий на экране будет абсолютно одинакова. Если вам нужно, чтобы от запуска к запуску набор значений случайной величины менялся (а значит и созвездия), употребите разик до использования функции Random процедуру Randomize. Вот так: Randomize; for i:=1 to 1000 do PutPixel (Random(640), Random(480), Random(16)) Задание 85:. “Дождь в луже”. Заполните экран окружностями радиуса 20 в случайных местах. Задание 86:. “Цирк”. То же самое случайных радиусов и цветов. Задание 87:. “Звезды в окне”. Звездное небо в пределах прямоугольника. Движение картинок по экрану Идею создания иллюзии движения картинок по экрану я объяснил в 2.8. Попробуем заставить двигаться по экрану слева направо окружность. Для этого мы должны сначала нарисовать слева окружность и тут же стереть ее, для чего нарисовать ее на том же месте, но черным цветом. Несмотря на то, что мы окружность тут же стерли, она успеет мелькнуть на экране, и глаз это заметит. Затем нужно нарисовать и стереть такую же окружность чуть правее, затем еще правее и т.д. Вот программа: USES Graph; VAR x, Device, Mode: Integer; BEGIN InitGraph(Device, Mode, ’< путь к графическим драйверам> ’); ReadLn; {Переключение в графический режим иногда занимает одну-две секунды, поэтому, если вы хотите увидеть движение с самого начала, щелкните по клавише ввода через пару секунд} x:=40; repeat Circle(x,100,10); {Рисуем белую окружность} SetColor(Black); Circle(x,100,10); {Рисуем черную окружность} x:=x+1 {Перемещаемся немного направо} until x>600; END. Когда вы попробуете выполнить эту программу на компьютере, изображение движущейся окружности может получиться некачественным - окружность в процессе движения может мерцать и пульсировать. Это связано с разверткой электронно-лучевой трубки вашего монитора. Попробуйте изменить радиус окружности или шаг движения по горизонтали или введите между рисованием и стиранием окружности небольшую паузу процедурой Delay - ситуация почти наверняка улучшится.
Задание 88:. Измените скорость движения. Если окружность движется небыстро, увеличьте скорость (x:=x+2), если слишком быстро – уменьшите процедурой Delay. Задание 89:. Пусть одновременно движутся две окружности. Задание 90:. Одна вниз, другая направо. Задание 91:. Заставьте окружность отскочить от правого края экрана. Задание 92:. Заставьте окружность бесконечно двигаться, отскакивая от правого и левого краев экрана.
Если вы будете рисовать окружности толстой линией, то увидите, что движение сильно замедлилось, так как толстая линия рисуется гораздо дольше тонкой. То же относится и к закрашенной окружности.
Задание 93:. “Биллиардный шар”. Нарисуйте «биллиардный стол» – большой прямоугольник. Окружность под углом летает по столу, отскакивая от его краев по закону отражения. Попав “в лузу” (любой из четырех углов стола), останавливается.
Задание 94: Изобразите полет камня, брошенного с башни, для задания из 6.3. Напоминаю условие задания. Камень бросили горизонтально со 100-метровой башни со скоростью v=20м/с. Его расстояние от башни по горизонтали (s) выражается формулой s=v*t, где t – время полета камня в секундах. Высота над землей h выражается формулой h=100 – 9.81*t2/2. Нарисуйте башню, землю, камень (маленькая окружность). Затем камень летит. Добейтесь, чтобы время полета камня на экране примерно соответствовало реальному времени, полученному в 6.3. Нарисуйте траекторию полета камня. Для этого достаточно, чтобы камень оставлял за собой следы в виде точек.
Указание: В задаче говорится о метрах, а на экране расстояние измеряется в пикселах. Поэтому вам придется задать масштаб, то есть вообразить, что один пиксел равен, скажем, одному метру. Тогда высота башни будет равна 100 пикселам, а скорость камня – 20 пикселов в секунду Правда, картинка на экране в этом случае может показаться вам маловатой. Тогда можете задать другой масштаб – один метр, скажем, - четыре пиксела. Тогда высота башни будет равна 400 пикселам, скорость камня – 80 пикселов в секунду, а формула изменится - h=4*(100 – 9.81*t2/2).
Задание 95 (сложное): Сделайте игру: Пушка на экране стреляет в цель ядрами. С какого выстрела она поразит противника? Между пушкой и целью расположена небольшая гора. Перед началом игры случайно задается горизонтальная координата цели. Затем рисуется картинка.
Перед каждым выстрелом компьютер отображает на экране номер выстрела и запрашивает у человека стартовую скорость ядра v и угол a наклона ствола пушки к земле. Затем летит ядро. Полет ядра подчиняется двум уравнениям: s=v*t*cosa и h=v*t*sina – 9.81*t2/2 (см. предыдущее задание). Считается, что цель поражена, если ядро «отгрызло» от нее хоть маленький кусочек.
Я рассмотрел основные простые возможности модуля Graph. Некоторые другие средства модуля будут рассмотрены в Глава 15.
|
||||||||||
Последнее изменение этой страницы: 2016-07-11; просмотров: 473; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.227.21.181 (0.01 с.) |