Свой рейтрейсер · Шаг 3 из 5
Тень
Шары освещены, но висят в воздухе: ни один не бросает тени. Тень — это вопрос, который точка задаёт лампе: «ты меня видишь?». Ответ даёт тот же луч — только выпущенный из точки к лампе.
Что сделать
Скажите, заслоняет ли какой-нибудь шар лампу от этой точки.
Что приходит
tochka— точка, которую освещают,(x, y, z)lampa— где стоит лампаshary— шары сцены: список пар(центр, радиус)luch_v_shar— ваш шаг 1:luch_v_shar(nachalo, napr, centr, radius)даётtилиNone
Что вернуть
True, если хоть один шар встречает луч от точки к лампе раньше лампы, иначе False.
Допишите функцию v_teni в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
с графикой когда тесты пройдут, ответ вашей функции нарисуется · все задачи с графикой
В проекте
Каркас спрашивает v_teni для каждой освещённой точки: в тени — свет лампы ей не достаётся. Решите шаг — и шары отбросят тени на пол и друг на друга.
Точка на полу (0, -1, 0), лампа над ней в (0, 5, 0), над точкой висит шар. Направление луча — lampa − tochka, то есть (0, 6, 0); шар встретился при t = 0.5 — на полпути, раньше лампы. Ответ True.
В проверке вместо вашего шага 1 стоит игрушка: она говорит «встреча на полпути» про шар радиусом 1 и «мимо» про все остальные.
Луч выходит из tochka с направлением lampa − tochka — не сведённым к длине 1. Тогда t = 1 — это сама лампа, и шар заслоняет её, только если встреча случилась при t < 1. Шар за лампой (t ≥ 1) не заслоняет.
Проверьте каждый шар из shary функцией luch_v_shar, которая пришла доводом. Встретил хоть один при t < 1 — True, ни один — False.
Точка может лежать на поверхности одного из шаров: свою точку старта luch_v_shar отбрасывает сама (запас 0.0001 из шага 1).
Образцовый тест целиком
luch_v_shar = lambda nachalo, napr, centr, radius: 0.5 if radius == 1 else None
v_teni((0, -1, 0), (0, 5, 0), [((0, 2, 0), 1)], luch_v_shar)
True
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.