Трехмерная поверхность задана треугольниками, которые я зачитываю в структуру 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/
|