Определите, пересекаются ли два треугольника или нет

Даны 2 набора точек

((x1, y1, z1), (x2, y2, z2), (x3, y3, z3)) и

((p1, q1, r1), (p2, q2, r2), (p3, q3, r3)), каждый из которых образует треугольник в трехмерном пространстве.

Как вы узнаете, пересекаются ли эти треугольники или нет?

Очевидное решение этой проблемы - найти уравнение плоскости, образованной каждым треугольником. Если плоскости параллельны, то они не пересекаются.

Иначе, найдите уравнение линии, образованной пересечением этих плоскостей, используя векторы нормалей этих плоскостей.

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

trianglesIntersect(Triangle T1, Triangle T2)
{
   if(trianglesOnParallelPlanes(T1, T2))
   {
      return false
   }
   Line L1 = lineFromPlanes(planeFromTriangle(T1), planeFromTriangle(T2))
   if(lineOnTriangle(T1, L1) AND lineOnTriangle(T2, L1))
   {
      return true
   }
   return false
}

Учитывая, что я знаю, как писать вышеупомянутые функции, какие другие реализации trianglesIntersect мне следует рассмотреть?

Существуют ли более быстрые алгоритмы, решающие эту проблему?

28
задан Adam Davis 19 August 2011 в 20:54
поделиться