我有一个由顶点和三角形组成的几何。我有一个大小为3102x3
的矩阵,其中每一行代表一个三角形,各列包含直接相邻的三角形的索引。
例如:
2 6 9
1 3 13
2 4 15
3 5 17
4 6 21
因此,三角形1的邻居是三角形2,6和9,等等。 现在,我要确定每个三角形与我感兴趣的一个三角形(例如三角形4)相距多少“行”。 我想要一个在索引4上具有值0的数组,在其邻居(索引3、5和17)上具有值1,然后相邻的3,5和17三角形(总共9个)应为2,依此类推。
我该如何轻松实现呢?
答案 0 :(得分:3)
您可以使用图形执行此操作。让我们想象每个三角形都是一个点,然后,这个三角形有3个邻居,详见您的矩阵。
我们可以根据您的输入创建一个邻接矩阵,然后使用graph
从该邻接图中创建图形。矩阵和distances
来计算每对节点之间的最短路径。
我保持代码的通用性,因此,如果您通过添加更多列来进行正方形/五边形/其他操作,那么这应该仍然有效。
这是完整的代码:
T = [2 6 9
1 3 13
2 4 15
3 5 17
4 6 21];
% Create graph values.
% Column 1 is triangle number (row number), column 2 is a neighbouring triangle
% So there are 3 rows per triangle, one for each neighbour
B = [ repmat( (1:size(T,1)).', size(T,2), 1 ), T(:) ];
% Make the relationship symmetric (i.e. if Tri3 is neighbour of Tri15, then
% Tri15 is neighbour of Tri3. This is necessary because T is incomplete.
% Use unique so we don't get duplicates if already specified
B = unique( [ B; fliplr(B) ], 'rows' );
% Create adjacency matrix from B
A = full( sparse( B(:,1), B(:,2), ones(size(B,1),1) ) );
% Create graph
G = graph( A );
% Get distances
D = G.distances;
现在D(i,j)
是三角形i
到三角形j
的最小距离,其中i
和j
是原始矩阵{{1}中的行}。
因此,如果您对三角形2感兴趣,可以这样做
T
>> distances = D(2,:);
distances =
[2, 0, 2, 4, 4, 3, Inf, Inf, 3, Inf, Inf, Inf, 1, Inf, 3, Inf, 5, Inf, Inf, Inf, 5]
的距离表明三角形从未相互连接。如果您希望以一种易于阅读的形式进行操作,则可以
Inf
输出到三角形2的距离(第一列是三角形编号,第二列是距离):
distances = D(:,2); % want the column version, same values as D(2,:);
idx = ~isinf( distances );
result = [ find( idx ), distances( idx ) ];