Свой рейтрейсер · Шаг 1 из 5
Луч и шар
Рейтрейсер рисует картинку наоборот: не свет летит в глаз, а из глаза через каждую точку экрана выпускают луч и смотрят, во что он упрётся. Самый простой предмет для луча — шар: о нём достаточно знать центр и радиус.
Что сделать
Найдите, где луч впервые встречает шар, — или скажите, что не встречает.
Что приходит
nachalo— откуда выходит луч, точка(x, y, z)napr— куда он идёт, тройка(dx, dy, dz); длиной 1 быть не обязанаcentrиradius— центр шара(x, y, z)и его радиус
Что вернуть
Число t, округлённое до 6 знаков: встреча — в точке nachalo + t · napr, ближайшая с t > 0.0001; встречи нет — None.
Допишите функцию luch_v_shar в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
с графикой когда тесты пройдут, ответ вашей функции нарисуется · все задачи с графикой
В проекте
Каркас выпускает луч через каждую точку картинки и спрашивает luch_v_shar про каждый шар: ближайшая встреча — то, что видно в этой точке. Решите шаг — и на картинке проступят шары.
Луч из начала координат прямо вперёд, (0, 0, 1), шар радиусом 1 с центром в (0, 0, 5). Передняя стенка шара — в точке (0, 0, 4), до неё четыре длины napr: ответ 4.0.
luch_v_shar((0, 0, 0), (0, 0, 1), (0, 0, 5), 1)
4.0
Точки луча — nachalo + t · napr при t ≥ 0. Встречи с шаром — корни квадратного уравнения a·t² + b·t + c = 0, где (o — это nachalo − centr):
a = napr · napr— скалярный квадрат направления;b = 2 · (o · napr);c = o · o − radius².
Дискриминант меньше нуля — встречи нет, None. Ровно ноль — луч касается шара, касание — встреча.
Из двух корней берётся меньший, если он больше 0.0001; иначе больший, если он больше 0.0001 (луч вышел изнутри шара или с его поверхности); иначе None. Ответ — round(t, 6).
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.