rusyska55011
@rusyska55011

Как построить симуляцию луча?

Решаю задачу №202 на Project Euler. Ищу способ реализации симуляции отражения луча. Нашел как зная координаты получить косинус угла. Если я захочу построить луч внутри треугольника, чтобы он отражался от его стен, как мне строить этот луч? Как задать направление движения?
Ниже вывел углы треугольника: {'a': 0.8944271909999159, 'b': 0.0, 'c': 0.4472135954999579}

from math import sqrt, fabs

def get_angle(a, b, c):
    ab = fabs(sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2))
    ac = fabs(sqrt((a[0] - c[0]) ** 2 + (a[1] - c[1]) ** 2))
    bc = fabs(sqrt((b[0] - c[0]) ** 2 + (b[1] - c[1]) ** 2))

    cos_a = (ab ** 2 + ac ** 2 - bc ** 2) / (2 * ab * ac)
    cos_b = (ab ** 2 + bc ** 2 - ac ** 2) / (2 * ab * bc)
    cos_c = (ac ** 2 + bc ** 2 - ab ** 2) / (2 * ac * bc)

    return {'a' : cos_a, 'b' : cos_b, 'c' : cos_c}

a = [0, 0]
b = [0, 25]
c = [12.5, 25]

print(get_angle(a, b, c))


Знаю что это можно перевести в арккосинус, а затем умножить на (180 / 3.14), тогда я получу угол в человеческих градусах. Но что с этим делать - я не знаю.
  • Вопрос задан
  • 190 просмотров
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Как это часто бывает в задачах на отражение света, не надо отражать луч. Представьте, что зеркало - это портал в Зазеркалье. Луч идет прямо и, проходя через зеркало, попадает в соседнюю треугольную комнату.

В этой задаче нужно представить, что вся плоскость замощена треугольниками, прямой луч выходит из одной точки до другой. Сколько сторон треугольников он пересечет - столько отрвжений и сделано.

Отражения, если вам так хочется, можно делать через вектора. Есть у вас вектор вдоль луча, и вектор вдоль зеркала и нормаль внутрь. Через скалярное произведение можно разложить вектор луча на перпендикуляр и паралледьный к зеркалу. Потом надо развернуть вектор перпендикуляр и сложить их.

Но в этой задаче это вам не поможет никак - ибо симулировать эти 100500 отражений и квантилионы возможных начальных углов никакого времени не хватит.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы