? видимо, всё-таки, (выпуклый) многогранник?
да, выпуклый многогранник
? Угол с ребром одинаков на обеих гранях.
если вопрос об угле между ребрами, то нет, в общем случае я использую треугольники в качестве граней, соответственно, угол разный
может быть рёбра, всё же?
да, ребро, ну или две точки, на которых построено ребро; тут какой примитив выбрать в качестве базового - все равно
Так в чём состоит задача? Такому описанию, во-первых, удовлетворяет куча всевозможных ломаных, и если зафиксировать несколько точек и/или рёбер, всё равно почти все остальные будут иметь возможность идти как угодно.
Есть уравнение прямой
, , которая изначально строится в полигоне
. При построение очередной точки мы обнаруживаем, что прямая пересекает ребро полигона
, определяем смежный по этому ребру полигон
и находим некий линейный оператор
. В результате все точки получаемые в ходе вычисления
после момента пересечения смежного ребра преобразуются с помощью оператора
и линия продолжается уже в смежном полигоне
. Задача определить данный оператор
.
Если вопрос состоит в том, чтобы определить, какая точка границы одного осколка соответствует каким точкам границ других (ведь если это вершина, может быть больше одного), то тут ничего впечатляющего не сделать, даже аккуратно описав математику. А именно, просто описываем все рёбра как параметризованные отрезки
(
— аффинная плоскость, а
— ограничение некоторого аффинного преобразования
) и сопоставляем каждому ребру
его двойник
(притом
), учтя, что
и
должны представлять одну и ту же точку. Теперь, когда нужно переходить туда-сюда, сначала определяем для интересующей точки ребро
и значение
, потом при
просто берём
, а в противном случае смотрим ещё и на смежные рёбра (полную структуру можно хранить в DCEL
) и их двойники. Возможно, если вершины граней будут попадаться часто, стоит завести отдельное сопоставление вершинам всех инцидентных рёбер.
Ну это позволит только определить точку выхода\входа для линии в двух смежных полигонах.
Теперь, если вам всё же надо сохранять угол, как спрашивает Geen, добавление совершенно мизерное (сначала повысив
до евклидовой плоскости): указать поворот для каждой упорядоченной пары рёбер-двойников. Если манипулируете углами, в виде угла; если чем-то другим, в виде там матрицы поворота или комплексного числа. Для любой точки пересечения прямой и границы осколка однозначно определён вектор, касательный прямой и смотрящий наружу (или внутрь, но надо выбрать что-то одно) из осколка, вот его при переходе на соседний осколок через пару рёбер-двойников и поворачиваем ассоциированным с ней поворотом. Если после этого вектор не смотрит внутрь осколка, значит, мы переходили через вершину и выбрали не ту грань, тогда надо поискать другую (или усовершенствовать алгоритм, чтобы по направлению этого вектора бралась сразу правильная грань). Когда есть вектор, смотрящий внутрь, проводим прямую и получаем следующий вектор наружу, ad infinitum.
Да это хорошее и простое решение задачи, но как мне поступить если функция задана в общем виде
, например так
?