Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > сечение 3D фигуры на С++


Автор: tmfd 18.4.2010, 11:24
Трехмерная поверхность задана треугольниками, которые я зачитываю в структуру s. s.A, s.B, s.C --- вершины треугольника. Нужно найти сечение этой фигуры плоскостью xOz и вывести на печать в формате:
Код

# первый отрезок
x1 y1
x2 y2

# второй отрезок
x3 y3
x4 y4


В нижеприведенном коде имеет место косяк: для выпуклой неразрывной трехмерной поверхности после выполнения программы в сечении отсувствуют отрезки и появляются лишние отрезки . Помогите найти что я упустил.

Код

#define eps 0.000001

Vector3D interpxz(const Vector3D & N, const Vector3D & M)
{
     if(fabs(N.y-M.y)<eps){std::cerr<<"ERR\n";}
     Vector3D X;
     X.x=N.x-N.y*(M.x-N.x)/(M.y-N.y);
     X.y = 0.0;
     X.z=N.z-N.y*(M.z-N.z)/(M.y-N.y);
     return X;
}


std::ofstream fsecxz("secxz");

void printxz(const Vector3D & V){
   fsecxz << V.x << ' ' << V.z << std::endl;
}




main(int argc, char* argv[]){

std::vector<Frame3D> s;

std::cerr << "load" << argv[1] << std::endl;
std::string sname(argv[1]);
load_border(s, sname.c_str());
size_t n = s.size();
std::cerr << "n=" << n << std::endl;

int i;
Vector3D N,M, A,B,C;
for(i=0; i<n; ++i){

    A=s[i].A;
    B=s[i].B;
    C=s[i].C;
   
    // одна вершина попала в сечение, 
    // две другие по разные стороны секущей плоскости
    if(fabs(A.y)<eps&&((B.y>0&&C.y<0)||(B.y<0&&C.y>0))){
        printxz(A);
        printxz(interpxz(B,C));
    }
    if(fabs(B.y)<eps&&((A.y>0&&C.y<0)||(A.y<0&&C.y>0))){
        printxz(B);
        printxz(interpxz(A,C));
    }
    if(fabs(C.y)<eps&&((B.y>0&&A.y<0)||(B.y<0&&A.y>0))){
        printxz(C);
        printxz(interpxz(B,A));
    }

    // две вершины в секущей плоскости
    // два отрезка треугольника пересекают секущую плоскость
    M = A; N = s[i].B;
    if(fabs(M.y)<eps&&fabs(N.y)<eps) {
        printxz(M);
        printxz(N);
    } else if( ((M.y<0.0)&&(N.y>0.0)) || ((M.y>0.0)&&(N.y<0.0)) ) {
        printxz(interpxz(N,M));
    }

    M = B; N = C;
    if(fabs(M.y)<eps&&fabs(N.y)<eps) {
        printxz(M);
        printxz(N);
    } else if( ((M.y<0.0)&&(N.y>0.0)) || ((M.y>0.0)&&(N.y<0.0)) ) {
        printxz(interpxz(N,M));
    }

    M = C;     N = A;
    if(fabs(M.y)<eps&&fabs(N.y)<eps) {
        printxz(M);
        printxz(N);
    } else if( ((M.y<0.0)&&(N.y>0.0)) || ((M.y>0.0)&&(N.y<0.0)) ) {
        printxz(interpxz(N,M));
    }

    fsecxz << std::endl;
} // for

}//main



Тест на эллипсе

http://img227.imageshack.us/i/59119240.png/http://img88.imageshack.us/i/93795801.png/




 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)