Френсис Хилл

Рис. 4.50. Находится ли точка 0 внутри полигона Р?

Тематическое задание 4.4. Отражения в комнате (двумерная трассировка луча)

Уровень сложности И.

В данном тематическом задании используются некоторые идеи и инструменты, описанные в этой главе, для осуществления замечательной, но в то же время простой имитации. Эта имитация выполняет своего рода трассировку луча, причем для простоты иллюстрации в двумерном пространстве. Трехмерная трассировка луча подробно рассматривается в главе 14.

В этой модели прослеживается путь одного маленького шарика, когда он рикошетирует от различных стен внутри некоторой «комнаты». На рис. 4.51, а показано поперечное сечение выпуклой комнаты V/, имеющей шесть стен и содержащей три выпуклых «колонны». Шарик начинает свой путь из точки 5 и движется по прямой линии в направлении с до тех пор, пока не ударится о препятствие, после чего он «отражается» от этого барьера и движется в новом направлении, снова по прямой. Это движение продолжается вечно. На рис. 4.51, б показан пример пути в виде ломаной линии, которую описывает луч, представляющий этот шарик.

Френсис Хилл

а . б Рис. 4.51. Эксперимент с двумерной трассировкой луча Для любого заданного начального положения луча 5 и его направления с трассировка его пути требует выполнения следующих двух операций.

О Нахождение первой стены «комнаты», о которую ударяется шарик.

О Нахождение нового направления, которое получит луч после отражения от этой первой стены.

Глава 4. Векторные инструменты для графики Обе эти операции уже обсуждались в этой главе. Отметим, что при создании каждого нового луча его начальная точка всегда находится на какой-нибудь стене, в «точке соударения» с этой стеной.

Мы описываем комнату списком выпуклых полигонов: колоннаО, колонна1,..., и располагаем их так, что колоннаО и есть та «комната», внутри которой происходит все действие. Информация о колоннах хранится в соответствующих массивах точек. Для каждого луча, начинающегося в положении 5 и двигающегося в направлении с, просматривается весь массив колонн для определения пересечений этою луча с каждой из колонн. Эта проверка осуществляется с использованием алгоритма Сайруса-Бека из раздела «Алгоритм Сайруса-Бека». Если происходит соударение с колонной, то в качестве «момента соударения» берется время «входа» луча в колонну. Инкапсулируем этот тест в подпрограмму


⇐ Предыдущая| |Следующая ⇒