Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сечение 3D фигуры на С++, построить сечение трехмерной фигуры 
:(
    Опции темы
tmfd
Дата 18.4.2010, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 12.9.2006

Репутация: нет
Всего: нет



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



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

user posted imageuser posted image




 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0414 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.