Создание сетки и уточнение сетки треугольников

Мне нужно найти способ связать треугольники, а затем уточнить их с помощью очистки. Мои вершины моих исходных треугольников хранятся внутри матрицы размера nb_points * 2. Мои лица хранятся в матрице nb_faces * 3. Данные для каждого лица хранятся в матрице nb_face * 1. Создание сетки выполняется путем погружения области с использованием середин сегментов треугольников.

Пример: Происхождение:

vertices = [0 1 ; 
            2 3 ; 
            4 1 ;
            4 5];
faces = [1 2 3;
         2 3 4];
data = [1 2]; 

Изображение фигуры

Результат, ожидаемый после создания сетки:

vertices = [0 1; 
            2 3; 
            4 1;
            4 5;
            1 2;
            3 2;
            2 1;
            3 4;
            4 3];
faces = [1 5 7;
         2 5 6;
         5 6 7;
         7 6 3;
         2 6 8;
         6 8 9;
         6 9 3;
         8 4 9];
data = [1 1 1 1 2 2 2 2];

Изображение новой фигуры

Я использую:

FV.Vertices = vertices; 
FV.Faces = faces; 
FV.FaceVertexCData = data;
figure; hold on; axis equal; grid on;
patch(FV,'FaceColor','flat');

Точность: я не хочу использовать следующие функции, которые дают слишком много вершин и граней:

Данные представляют собой температуры, поскольку это моделирование теплопередачи.


person Infinite Learner    schedule 17.12.2019    source источник


Ответы (1)


С помощью цикла for это можно сделать довольно легко, вот одно решение:

% Dummy data
vertices = [0 1 ; 
            2 3 ; 
            4 1 ;
            4 5];
faces = [1 2 3;
         2 3 4];
data = [1 2]; 

% Number of vertices
vnum = size(vertices,1);

% new faces empty vector
nfaces = [];

% triangular shift
tshift = [2,-1,-1].';

% Run the algorithm
for ii = 1:size(faces,1)
    % For each triangle get the 3 pairs of vertices
    nsk = [faces(ii,1), faces(ii,2);faces(ii,2), faces(ii,3);faces(ii,3), faces(ii,1)];
    % Compute the center of each pair of vertices
    cmiddle = (vertices(nsk(:,1),:)+vertices(nsk(:,2),:))/2
    % Compute the new faces
    nfaces = [nfaces;[nsk(:,1),vnum+(ii*3-3+[1:3].'),vnum+(ii*3-3+[1:3].')+tshift];[(vnum+(ii*3-2)):(vnum+(ii*3))]]
    % Add the new vertices
    vertices = [vertices;cmiddle];
end

% Delete the duplicate vertices
[vertices,~,ind] = unique(vertices,'rows');
faces = ind(nfaces);

% Plot
figure; hold on; axis equal; grid on;
patch('Faces',faces,'Vertices',vertices,'FaceVertexCData',kron(data,ones(1,4)).','FaceColor','flat')
colorbar

Если вы найдете способ сгенерировать вектор nsk без цикла, вы даже можете избавиться от цикла. Этот код будет работать только с треугольником, но при необходимости его можно адаптировать.

Результат:

введите описание изображения здесь

Вы можете повторить операцию:

введите описание изображения здесь

person obchardon    schedule 18.12.2019