LINUX.ORG.RU

сечение 3D фигуры


0

0

имеется файл, содержащий изображение трехмерной фигуры состоящей из треугольников. Чем из гнутого софта можно построить сечение этой фигуры плоскостью xOz? ковырялся с гнуплотом: 3d изображение получилось, изолинии получились, но сечение сделать не смог.

Может есть какая программа, которая выделит сечение в виде системы точек?

пример части файла:

# count = 304

0.0000000000 0.0000000000 1.0000000000

0.3420201433 0.0000000000 0.9396926208

0.3234885486 0.1110537590 0.9396926208

0.0000000000 0.0000000000 1.0000000000

#

0.0000000000 0.0000000000 1.0000000000

0.3234885486 0.1110537590 0.9396926208

0.2699019501 0.2100731200 0.9396926208

0.0000000000 0.0000000000 1.0000000000

#

0.0000000000 0.0000000000 1.0000000000

0.2699019501 0.2100731200 0.9396926208

0.1870672874 0.2863277989 0.9396926208

0.0000000000 0.0000000000 1.0000000000



Последнее исправление: tmfd (всего исправлений: 2)

1. Построить поверхность без учета тех точек, что не принадлежат фигуре.

2. Добавить второй график секущей плоскости.

3. Объединить

4. ???

5. Профит.

Zodd ★★★★★
()
Ответ на: комментарий от anotheranonymous

ближе C++. Помогите добить. проблема: выпуклая непрерывная фигура без дырок и разрывов в сечении получается в виде ломаной с отсуствующими отрезками. s структура с полями A B C --- типа Vector3D


std::ofstream fsec(«sec»);
int i;
Vector3D M, N, X;
for(i=0; i<nGt; ++i){
M = s[i].A;
N = s[i].B;
// (X.x-N.x)/(M.x-N.x)=(0.0-N.y)/(M.y-N.y) => X.x=N.x-N.y*(M.x-N.x)/(M.y-N.y)
// (X.z-N.z)/(M.z-N.z)=(0.0-N.y)/(M.y-N.y) => X.z=N.z-N.y*(M.z-N.z)/(M.y-N.y)
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 ;
}

M = s[i].B;
N = s[i].C;
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 ;
}

M = s[i].C;
N = s[i].A;
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 ;
}
fsec << std::endl;
} // for

tmfd
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.