Программирование >>  Рекурсивные объекты и фрактальные узоры 

1 2 3 4 [ 5 ] 6 7 8 ... 43


Чтобы повернуть объект относительно центра (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).



1 2 3 4 [ 5 ] 6 7 8 ... 43

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика