|
Программирование >> Рекурсивные объекты и фрактальные узоры
Чтобы повернуть объект относительно центра (X, Y), необходимо сначала перенести в точку (X, У) начало координат, то есть перенести все поворачиваемые точки на вектор (-Х, -У), что уже рассмотрено. Затем выполняется собственно поворот по формуле: ДЛЯ КАЖой точки объещ :. -, Хр Xp*cos(a) - Ур*б1п(а) Yp Xp*sin{a) + Yp*cosial КОНЕЦ ЦИКЛА Готовая фигура переносится назад на вектор (X, У). При сжатии и растяжении тоже придётся сначала совместить центр (X, Y) с началом координат, затем выполнить преобразование и вернуть фигуру на место. Само преобразование сводится к умножению соответствующих координат на коэффициенты Sx и Sy: для КАЖДОЙ точки объекта Хр = Xp*Sx -ЩЩ ЦИКЛА* 1 Конечно, в настоящее время все базовые графические функции реализуются на уровне аппа- ратуры видеокарты или стандартных библиотек (таких как OpenGL или DirectX). 2.2. РАСЧЁТ ТРАЕКТОРИЙ 2.2.1. Противотанковая оборона Расчёт упреждающего выстрела После алгебры, химии и геометрии давайте займемся кинематикой - разделом механики, посвященным движению тел вне связи с причинами, вызывающими это движение. Компьютерное моделирование движения тел интересно не только как практикум, но и как составная часть программирования компьютерных игр. Из начальной точки с координатами (XT, YT) равномерно и прямолинейно с известной скоростью Va по экрану движется вражеский танк. Танк приближается к нашему охраняемому объекту (направление движения может задаваться, найример, углом отклонения от оси абсцисс) явно с не самыми мирными намерениями. В точке (Хг, Уг) находится противотанковая пушка, способная мгновенно выстрелить в любом направлении. Пушечный снаряд летит со скоростью Vr. О соотношении скоростей танка и снаряда не делается никаких предположений. Не исключено, что танк движется даже быстрее снаряда (такое воз- 2.1.3. Проволочная графика Геометрические преобразования плоских фигур Школьную алгебру и химию мы вспомнили, перейдем теперь к геометрии. Точнее, к планиметрии. Требуется написать простейший редактор векторной графики. Объекты, обрабатываемые программой, представляют собой плоские геометрические фигуры, задаваемые множеством составляющих их отрезков. Отрезки считываются из входного файла. Необходимо реализовать следующие функции: вывод объекта на экран; перенос объекта на вектор (Тх, Ту); поворот объекта на угол а относительно заданной точки (X, Y); сжатие/растяжение объекта относительно центра (X, Y) с коэффициентами (Sx, Sy). Пользователь с клавиатуры указывает выполняемое преобразование (перенос, поворот, растяжение/сжатие) и вводит параметры преобразования. Компьютер выполняет операцию и рисует на экране получившуюся фигуру. Обратите внимание: эти функции - упрощённые (двумерные) аналоги операций над геометрическими объектами, без которых не обходится ни одна современная трёхмерная игра*. Вы сможете найти им хорошее применение при решении задачи Космическая дуэль из пяггой главы. Решение Здесь я приведу формулы, с помощью которых вы сможете реализовать все требуемые функции преобразования объекта. Перенос объекта на вектор (Тх, Ту) - самая простая операция. Требуется лишь прибавить значения Тх и Ту к соответствующим координатам точек объекта: ЛПЯ УХ> ,= Yp + fy \ юнт цйкл7. Из соотношения (Yr - Ya)/(VYa - VYr) = (Xr - Xa)/(VXa - VXr) следует уравнение (Yr - Ya)*{VXa - VXr) = (Xr - Xa)*(VYa - VYr) Раскрывая скобки и группируя подобные члены, получаем выражение VXr*(Ya - Yr) + (Yr*VXa - Ya*VXa) = VYr*(Xa - Xr) + Xr*VYa - Xa*VYa Если ввести обозначения a = Xa - Xr b = Xr*VYa - Xa*VYa с = Ya - Yr d = Yr*VXa - Ya*VXa, TO выражение переписывается в гораздо более простом виде: c*VXr + d = a*VYr + b Отсюда VYr = (c*VXr + d - b)/а По теореме Пифагора вертикальная и горизонтальная составляющие скорости ракеты связаны со значением Vr соотношением Vr = VXr + VYr Подставляя в него значение VYr, получаем Vr = vxr + (c*VXr + d - b)W а Раскрыв скобки, приходим к обычному квадратному уравнению: (1 + cVa2)*VXr2 + (2*c*(d - b)/a2)*VXr + ((d - Ъ)Че? - Vr) = О В более удобных обозначениях к = 1 + с/а L = 2*c*(d - Ъ)/а? М = (d - ЪУ/з? - Vr уравнение превращается в K*VXr + L*VXr + М = О Далее решения находятся по известной формуле -L±ylL-4KM VXr = Математически любому положительному значению подкоренного выражения соответствуют два решения квадратного уравнения. Физический можно, например, если снаряд представляет собой сравнительно медленное самоходное устройство с динамитным зарядом на борту). Задача заключается в моделировании системы автоматического управления противотанковой пушкой. Все численные параметры задаются с клавиатуры либо назначаются случайным образом. 11а экране появляется движущийся танк и пока что бездействующая пушка. На красивой спрайтовой анимации не настаиваю, сгодятся и простые разноцветные круги. При нажатии клавиши пробел путпка мгновенно производит выстрел с тем расчётом, чтобы он поразил танк. Вывод анимации продолжается до момента попадания снаряда в танк. Понятно, что суть задачи заключается в определении правильного направления выстрела. Поскольку скорость снаряда не бесконечно велика, приходится стрелять на упреждение (в предположении что танк не изменит скорости и направления своего движения). Если существует нескольсо вариантов решения задачи, требуется выбрать направление пушки, приводящее к скорейшему поражению цели. Если наоборот, попасть в танк нельзя (например, если танк движется по направлению от пушки, а скорость снаряда меньше скорости танка), следует сообщить об этом пользователю. Решение Поскольку математическое решение задачи является наиболее трудной частью (программирование в данном случае - дело техники), я остановлюсь лишь на выводе необходимых фо1жул. Предположим, что поражаемая цель (танк) находится в точке (Ха, Ya) экрана и движется со скоростью Va, разложенной на составляющие VXa (вдоль оси абсцисс) и УУавдоль оси ординат). Пушка находится в точке (Хг, Уг), Скорость снаряда равна Vr (соответствующие составляющие равны VXr и VYr). Наша задача состоит в поиске значений VXr и VYr. Для начала заметим, что поскольку при равномерном прямолинейном движении время в пути равно расстоянию, делённому на скорость, ракета должна поразить цель через t единиц времени после запуска: t = (Yr - Ya)/(VYa - VYr) = (Xr - Xa)/(VXa - VXr) Формула справедлива как для горизонтальной, так и для вертикальной составляющей скорости. Расстояние вычисляется как разность координат, а скорость сближения равна разности скоростей танка и ракеты. Рис. 2.1. Центральное столкновение двух шаров Края экрана ограничены стенками : достигнзш края экрана, шар отражается от стенки и продолжает движение в противоположную сторону. Потери энергии при движении также считаются нулевыми, поэтому моделирование прекращается лишь по требованию пользователя. Теперь можно запрограммировать описанную модель и вывести анимацию. Входными данными являются массы и скорости шаров. Подсказка Рассчитать скорости шаров после соударения вам помогут законы сохранения импульса и энергии. Решение Реализация модели довольно проста, поэтому не будем на ней останавливаться. А вот над формулами придётся немного потрудиться. Пусть массы шаров равны ml и т2, а скорости - vl и v2. Если знаки скоростей равны, шары летят в одну и ту же сторону, иначе - в противоположные. Наша задача - определить скорости шаров vl и v2 после столкновения. Очевидно, что движение шаров подчиняется законам сохранения импульса и энергии. По закону сохранения импульса выполняется равенство: A no закону сохранения энергии: Вынеся массы за скобки, эти два равенства можно переписать следующим образом: (2.5.1) (2.5.2) Bo втором равенстве можно разложить разность квадратов на множители: mj(v - V/) (v + V/) = m2(v/2 v.) (v, + vj (2.5.3) Разделив равенство (2.5.3) на (2.5.1), получаем: + V = V + V, Отсюда = V, + V, (2.5.4) Подставляя полученн)ао формулу для v2 в равенство (2.5.1), получаем: откуда (2.5.5) V/ = (v(m - m) + 2mv} / {т., + m) Вот и всё. Вычисляя выражение (2.5.5), можно получить итоговую скорость первого шара. Подставляя её в формулу (2.5.4), находим итоговую скорость второго шара. смысл, однако, имеют лишь те решения, для которых t > О (то есть поражение цели происходит в будущем, а не в настоящем или в прошлом). 2.2.2. Столкновение Расчёт скоростей физических тел Эта модель призвана проиллюстрировать процесс упругого столкновения двух шаров. Два шара разной массы с разными скоростями равномерно и прямолинейно движутся навстречу друг другу. В конце концов происходит соударение, и шары разлетаются. Столкновение считается упр)тим, то есть потери энергии в момент удара отсутствуют. В этой задаче предполагается, что траектории обоих шаров лежат на одной прямой (рис. 2.1).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |