int rayHitCRay thisRay. int which, doub1e& tHit)

вычисляющую время удара tHit луча thisRay о колонну номер which (piHarwhich) и возвращающую 1, если луч ударяется о колонну, и 0, если луч проходит мимо. Подходящим типом для Ray является struct{Point2 startPt: Vector2 dir;} или соответствующий класс; эта структура содержит стартовую точку луча S и его направление с.

Мы хотим знать, с какой колонной луч столкнется в первый раз. Ответ на этот вопрос можно получить, если зафиксировать самое раннее время соударения при просмотре списка колонн. Следует учитывать только положительные значения времени соударения: отрицательные моменты соударения соответствуют соударениям с точками, лежащими на противоположном направлении пути луча. Когда это самое раннее время соударения найдено, от точки S в эту точку рисуется отрезок прямой.

Необходимо найти направление отраженного луча во время его движения от точки соударения. Это направление с' отраженного луча выражается через направление с падающего луча с помощью уравнения (4.27) и имеет следующий вид: с'-с-2(с'-п)п, (4.68)

где п - единичный вектор нормали к той стене комнаты, с которой происходит соударение. Если соударение происходит с колонной внутри комнаты, то используется внешняя нормаль; если же удар приходится на стену самой комнаты, то используется внутренняя нормаль.

Напишите и запустите программу, рисующую путь луча, отражающегося от внутренних стен комнаты W и от стенок выпуклых колонн внутри этой комнаты. Составьте ее так, чтобы пользователь мог читать список колонн из внешнего файла. Кроме того, пользователь должен задавать начальное положение луча и его направление. (См. в главе 11 двумерную трассировку луча в эллиптической комнате.)

Тематическое задание 4.5. Отсечение Сайруса-Бека Уровень сложности И.

Напишите и запустите программу, выполняющую отсечение последовательности отрезков границами выпуклого полигона. Пользователь задает полигон, отмечая мышью последовательность точек (после нажатия клавиши «С» полигон считается законченным и начинается отсечение). Затем генерируется последовательность отрезков со случайно выбираемыми концевыми точками.


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