Полагаю, ваш трехмерный многоугольник является плоским (иначе это не совсем многоугольник, и он не очень хорошо определен).Поэтому вы можете найти 2D ортонормированный базис для этой плоскости.Это означает, что вы можете использовать любой алгоритм 2D триангуляции (вы можете найти много реализаций c # в Интернете) и вернуться к 3D, используя вашу ортонормированную основу.Таким образом, вы получите трехмерные треугольники и сможете легко выполнить тест пересечения луча с полигоном, выполнив несколько тестов пересечения луча с треугольником.
Другой способ - выполнить вычисление пересечения плоскости луча.Возьмем точку пересечения P, представим ее, используя 2D координаты с указанным выше ортонормированным базисом.Кроме того, как и в предыдущем решении, представьте свой многоугольник в 2D, используя ту же основу.Затем запустите любой двухмерный алгоритм «точка в многоугольнике», и вы получите свои результаты.
Обновление : вот математика Вы можете взять любые две точки на плоскости p1, p2 (например,две точки многоугольника) и возьмем вектор u = p2 - p1.Нормализовать это, и это первый базисный вектор.Затем вы берете нормаль N плоскости и вычисляете v = cross_product (u, N) и нормализуете v. Это второй базисный вектор.Обратите внимание, что оба вектора имеют единичную длину и они ортогональны друг другу.Поэтому они образуют ортонормированный базис.
Теперь определим p1 как начало плоскости.Тогда перевод в 2D любой точки q на многоугольнике (q может быть одной из вершин многоугольника или любой другой точкой на плоскости многоугольника):
x = dot_product(q - p1, u)
y = dot_product(q - p1, v)
Здесь x, y - двумерные координаты точки,
Так что после перевода всего в 2D и выполнения ваших 2D алгоритмов вы можете перевести любую 2D точку (x, y) обратно в 3D следующим образом:
q = p1 + x * u + y * v
Здесь * - скалярный векторпроизведение (x, y - скаляры, а u, v - векторы).
Алекс.