Нормали вершин триангуляции Matlab 2.5D Делоне

#matlab #mesh #delaunay

#matlab #сетка #Делоне

Вопрос:

Я пытаюсь сделать то, что, по моему мнению, называется 2.5D триангуляцией Делоне и вычислением нормалей вершин в Matlab. Используя класс delaunayTriangulation и связанные с ним функции, я могу выполнить триангуляцию плоскости x, y и получить желаемую сетку. Однако попытка извлечь нормали поверхности дает нормали только для плоской поверхности. Это имеет смысл, поскольку я предоставил только 2D-данные для delaunayTriangulation , но я не понимаю, как функция vertexNormal() полезна в этом случае. Чего мне не хватает — как я могу извлечь нормали для триангулированной сетки со свойствами высоты?

Я понимаю, как это сделать для сетки, используя surform() или аналогичные функции, но я хочу, чтобы это работало и для разбросанных точек без необходимости их сетки.

Рабочий пример для иллюстрации:

 % Generate some data
rng(42); % Seed random gen
[X,Y] = meshgrid( 1:100, 1:100 );
k = ones(15)./(15^2);
Z = conv2(rand(size(X)), k, 'same'); % Smooth data to have a nice surface to test with
% Triangulate
DT = delaunayTriangulation(X(:),Y(:));
% DT.vertexNormal are all [0 0 1] (flat surface...) - makes sense.
DT3 = delaunayTriangulation(X(:),Y(:),Z(:));
% DT3.vertexNormal() --> gives error because we now did 3D delaunayTrinagulation and have tetraheders, not triangles. Also makes sense. 
% DT.Points = [DT.Points, Z(:)]; --> Something crazy like trying to add Z points after triangulation gives error, obviously
 

Ответ №1:

Я понял это, но опубликую ответ здесь для нуждающихся. По-видимому, для этого и предназначена функция triangulation():

 % Triangulate 2D
DT = delaunayTriangulation(X(:),Y(:));
% Triangulate 3D ("2.5D")
DT_3D = triangulation( DT.ConnectivityList, X(:), Y(:), Z(:) );
% Calculate vertex normals
vertex_normals = DT_3D.vertexNormal();