2012-04-30 2 views
1

У меня вопрос, связанный с построением цилиндрической поверхности в Matlab. Мой набор данных состоит из облака точек X, Y, Z координат с соответствующими значениями интенсивности C.Matlab triangulate и plot цилиндрическое облако точки в 3D

Я могу построить их с помощью функции scatter3:

figure 
scatter3(X,Y,Z,8,C) 

результатов в следующем изображении:

Однако, я хотел бы построить поверхность этого объекта, а не точки. Я пытался добиться этого при помощи триангуляции Делоне

tri  = delaunay(X,Y); 
figure 
trisurf(tri,X,Y,Z,C,'FaceColor','interp') 

Link to screenshots

Как вы можете видеть на картинке результат не то, что я хотел бы, как есть трудности с триангуляции. Мне кажется, что алгоритм не очень хорошо справляется с тем, что я получаю те же самые X и Y координаты несколько раз.

Следуя пример, введенный на странице TriRep помощи Я пытался использовать следующий подход:

dt = DelaunayTri(X,Y,Z); 
tr = TriRep(dt, X, Y, Z); 

увы без успеха, как я получаю следующее сообщение об ошибке при вызове TriRep функции:

? ?? Ошибка при использовании ==> TriRep Параметр должен быть «двойной матрицей».

Я предполагаю, что я должен сдерживать свою геометрию, и я думал, что я нашел решение в Example 1 here с помощью функции freeBoundary - хотя мне нужен выход функции TriRep для расчета этого. Вот где я застрял. Как вы можете видеть, я не эксперт в методах триангуляции, и я был бы очень признателен за любую помощь, которую вы могли бы предложить. Благодаря!

ответ

2

Я думаю, что вы хотите, это не простая триангуляция, а скорее выпуклая оболочка вашего множества точек.

Классическая аналогия для выпуклой оболочки в 2d -
Если представить свой набор очков, чтобы быть гвоздями на доске, то выпуклая оболочка является многоугольником, который будет сформирован путем растяжения резинки вокруг точек - то есть он касается внешних точек, но не внутренних.

И, расширяя это, вы можете думать о 3d выпуклой оболочке как о «скине» внешних точек в облаке точек.

Выпуклая оболочка является отправной точкой для более сложных методов вычислительной геометрии, но в вашем случае вы получите сетку, которую вы ищете.

Я не использовал версию Matlab, но это выглядит довольно просто: http://www.mathworks.com/help/techdoc/ref/convhulln.html

Edit: После просмотра ваших комментариев ниже: Если вы уже используете структуру TriRep, вы можете использовать его, чтобы получить лицо нормали, затем удалите любые треугольники, лицо которых имеет нормаль, близкую к прямой вверх/вниз.EG, если начать с примером из дока страницы Matlab в FaceNormals http://www.mathworks.com/help/techdoc/ref/trirep.facenormals.html:

numpts = 100; 
thetha = rand(numpts,1)*2*pi; 
phi = rand(numpts,1)*pi; 
x = cos(thetha).*sin(phi); 
y = sin(thetha).*sin(phi); 
z = cos(phi); 
dt = DelaunayTri(x,y,z); 
[tri Xb] = freeBoundary(dt); 
tr = TriRep(tri, Xb); 
P = incenters(tr); 
fn = faceNormals(tr); 
trisurf(tri,Xb(:,1),Xb(:,2),Xb(:,3), 'FaceColor', 'cyan', 'faceAlpha', 0.8); 

Тогда вы можете просто запустить через нормали, и удалить любое лицо с высоким г величиной:

for(i=196:-1:1) 
    if(abs(fn(i,3))>0.8) 
     tri(i)=[]; 
    end 
end 
trisurf(tri,Xb(:,1),Xb(:,2),Xb(:,3),'FaceColor','red','faceAlpha',0.7); 

HTH - - RC

+0

Спасибо, что указал мне в этом направлении. Я пробовал это, и он выглядит намного лучше, хотя все еще не совсем то, чем я был. В настоящее время на поверхности слишком мало лиц, а цилиндр также закрыт на верхнем и нижнем концах. То, что я имел в виду, - это открытый цилиндр с максимально возможными малыми гранями на боковых стенках без перекрытия. У вас есть идея, как я могу это достичь? –

+0

Использование T = delaunayn (X, {'Qt', 'Qc', 'Qx', 'Q4'}); Я смог получить некоторые новые результаты, которые действительно близки к тому, что я хочу (я не буду использовать выпуклую оболочку, поскольку это будет опускать точки, учитывая, что цилиндр не полностью выпуклый). Моя последняя проблема теперь заключается в том, что верхняя и нижняя грани цилиндра закрыты. Есть ли способ указать «максимальное расстояние триангуляции» в delaunayn? Если бы я мог указать максимальную длину грани треугольника, тогда я мог бы легко избежать заполнения верхней и нижней грани ... –

+0

Просто примечание: цикл for работает вниз, а не вверх, поэтому вам не нужно возиться с вычислением индексации после удаления строк. –

Смежные вопросы