LINUX.ORG.RU

извлечь площадки


0

1

первая проблема. Помогите с превращением эллипсоида в систему треугольных площадок. Есть матрицы x,y,z хранящие координаты точек эллипсоида, полученные по параметрическим уравнениям. Нужно преобразовать x,y,z в массив tri хранящий сегменты (площадки) с координатами трех точек (вершин площадок или рамок). Понимаю что моя попытка (второй листинг) совсем не верная, т.к. даже число точек будет меньше чем n1*n2 из-за полюсов. Направление обхода точек должно определять нормаль к эллипсойду по правилу правого (впрочем можно и левого) винта.

вторая проблема. не смог в mgrid передать переменные n1 и n2 из-за j.

#!/usr/bin/python
from numpy import *
from enthought.mayavi import mlab
rad=array([2.,2.,1.])
z=array([0.,0.,0.])
p,t=mgrid[0.:pi:4j,0:2.*pi:8j]
x=z[0]+rad[0]*sin(p)*cos(t)
y=z[1]+rad[1]*sin(p)*sin(t)
z=z[2]+rad[2]*cos(p)

mlab.clf()
mlab.mesh(x, y, z, color=(0, 1, 1))
mlab.mesh(x, y, z, representation='wireframe', color=(1, 0, 0))
mlab.show()
tri=zeros((32,3,3))
cycle=0
for i in range(3):
    for j in range(5):
        tri[i*5+j][0]=array([x[i][j],y[i][j],z[i][j]])
        tri[i*5+j][1]=array([x[i-1][j],y[i-1][j],z[i-1][j]])
        tri[i*5+j][2]=array([x[i][j-1],y[i][j-1],z[i][j-1]])
print tri

Вам код нужен или результат? Если результат, то посмотрите SALOME, там есть куча различных триангуляций.

bvvv
()

А какие требования к треугольникам? Я могу предложить такой алгоритм (хорошо обкатанный для сферы):

строите додекаэдр вписанный в сферу.

каждую грань додекаэдра бьете на пять треугольников - поднимаете центр грани на сферу.

Каждый треугольник бьете на четыре (по центрам ребер исходного треугольника), и так рекурсивно нужное число раз. Получаются почти правильные треугольники в итоге.

У нас эта штука реализована, см напр. http://a-iv.ru/aivlib/include/sphereT.hpp но там алгоритм нетривиальный.

Сфера к эллипсоиду приводится легко... этот вариант куда лучше построения сетки в сферических координатах, т.к. нет сгущений на полюсах и сетка изотропна. А для сферических координат все просто - имеете набор трапеций, каждую делите по диагонали пополам...

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