? видимо, всё-таки, (выпуклый) многогранник?
да, выпуклый многогранник
? Угол с ребром одинаков на обеих гранях.
если вопрос об угле между ребрами, то нет, в общем случае я использую треугольники в качестве граней, соответственно, угол разный
может быть рёбра, всё же?
да, ребро, ну или две точки, на которых построено ребро; тут какой примитив выбрать в качестве базового - все равно
Так в чём состоит задача? Такому описанию, во-первых, удовлетворяет куча всевозможных ломаных, и если зафиксировать несколько точек и/или рёбер, всё равно почти все остальные будут иметь возможность идти как угодно.
Есть уравнение прямой

, , которая изначально строится в полигоне

. При построение очередной точки мы обнаруживаем, что прямая пересекает ребро полигона

, определяем смежный по этому ребру полигон

и находим некий линейный оператор

. В результате все точки получаемые в ходе вычисления

после момента пересечения смежного ребра преобразуются с помощью оператора

и линия продолжается уже в смежном полигоне

. Задача определить данный оператор

.
Если вопрос состоит в том, чтобы определить, какая точка границы одного осколка соответствует каким точкам границ других (ведь если это вершина, может быть больше одного), то тут ничего впечатляющего не сделать, даже аккуратно описав математику. А именно, просто описываем все рёбра как параметризованные отрезки
![$f\colon[0;1]\to A$ $f\colon[0;1]\to A$](https://dxdy-01.korotkov.co.uk/f/8/b/c/8bcb6848ca3c4cabc283a7c6abc541bf82.png)
(

— аффинная плоскость, а

— ограничение некоторого аффинного преобразования

) и сопоставляем каждому ребру

его двойник

(притом

), учтя, что

и

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

и значение

, потом при

просто берём

, а в противном случае смотрим ещё и на смежные рёбра (полную структуру можно хранить в DCEL
) и их двойники. Возможно, если вершины граней будут попадаться часто, стоит завести отдельное сопоставление вершинам всех инцидентных рёбер.
Ну это позволит только определить точку выхода\входа для линии в двух смежных полигонах.
Теперь, если вам всё же надо сохранять угол, как спрашивает Geen, добавление совершенно мизерное (сначала повысив

до евклидовой плоскости): указать поворот для каждой упорядоченной пары рёбер-двойников. Если манипулируете углами, в виде угла; если чем-то другим, в виде там матрицы поворота или комплексного числа. Для любой точки пересечения прямой и границы осколка однозначно определён вектор, касательный прямой и смотрящий наружу (или внутрь, но надо выбрать что-то одно) из осколка, вот его при переходе на соседний осколок через пару рёбер-двойников и поворачиваем ассоциированным с ней поворотом. Если после этого вектор не смотрит внутрь осколка, значит, мы переходили через вершину и выбрали не ту грань, тогда надо поискать другую (или усовершенствовать алгоритм, чтобы по направлению этого вектора бралась сразу правильная грань). Когда есть вектор, смотрящий внутрь, проводим прямую и получаем следующий вектор наружу, ad infinitum.
Да это хорошее и простое решение задачи, но как мне поступить если функция задана в общем виде

, например так

?