Расскажите что именно вы делаете, а то из вашего кода непонятно.
Вообще говоря вам ничего не остается кроме как проверять каждую пару вершин на предмет того лежат ли они по разные стороны плоскости путем подстановки в уравнение плоскости, и если лежат то искать точки пересечения.
Поверхность состоит из независимых треугольников и в общем случае имеет разрывы. Но, сейчас я тестирую код на непрерывных поверхностях.
Строим сечение плоскостью
. Рассматриваю каждый отрезок
, образующий треугольник. Если координата
равна нулю с точностью до значения переменной eps (кстати взял слишком большой, потому и лишний отрезок появился) , то я просто сохраняю отрезок в файл:
Код:
if(fabs(M.y)<eps&&fabs(N.y)<eps) {
fsec<<M.x<<' '<<M.z<<std::endl<<N.x<<' '<<N.z<<std::endl;
}
Далее, возможна ситуация когда отрезок пересекает плоскость
, тогда я нахожу точку пересечения и сохраняю ее в файл:
Код:
} else if( ((M.y<=0.0)&&(N.y>=0.0)) || ((M.y>=0.0)&&(N.y<=0.0)) ) {
X.x=N.x-N.y*(M.x-N.x)/(M.y-N.y);
X.z=N.z-N.y*(M.z-N.z)/(M.y-N.y);
fsec << X.x << ' ' << X.z << std::endl ;
}
Здесь же предусмотрен случай, когда треугольник касается секущей плоскости одной точкой (вершиной).