MATLAB多散点寻找二维凹凸共存顶点问题

MATLAB散点寻找二维凹凸包问题:数据和生成的二维图像都在问题里面,凹凸都存在的,不是分开求解凹凸边界。
已知多个散点坐标,和三角划分行序号,用MATLAB做一个寻找外边界凹凸共存图像的程序。(带代码注释和研究思路)
散点数据:
0.940 6.325 0
0.598 7.179 0
0.427 7.607 0
1.111 8.034 0
2.137 8.718 0
2.991 8.034 0
4.017 7.350 0
4.957 8.034 0
6.068 8.718 0
6.923 8.034 0
7.094 7.350 0
7.521 6.752 0
7.949 7.179 0
8.291 7.179 0
9.316 6.325 0
9.658 5.470 0
10.000 4.615 0
9.829 3.761 0
9.316 2.906 0
8.632 2.906 0
8.120 3.248 0
7.692 2.906 0
7.436 2.051 0
7.521 1.197 0
7.179 0.342 0
6.581 0.000 0
6.239 0.085 0
5.385 0.342 0
4.530 0.769 0
3.675 1.197 0
2.821 0.769 0
1.966 0.342 0
1.111 0.171 0
0.684 0.342 0
0.342 1.197 0
0.171 2.051 0
0.769 2.906 0
0.940 3.761 0
0.000 4.615 0
0.256 5.470 0
6.709 0.214 0
7.906 6.966 0
1.309 1.480 0
1.122 0.786 0
4.575 3.387 0
1.464 7.428 0
5.938 5.655 0
8.486 5.501 0
7.413 4.991 0
6.470 3.839 0
三角划分序号:
49 21 48
46 1 6
46 4 3
46 3 2
44 35 34
44 43 35
6 5 4
47 7 45
7 6 1
47 10 9
47 11 10
47 9 8
21 20 18
48 16 15
50 22 21
42 14 13
48 42 12
20 19 18
21 17 16
21 18 17
49 12 47
38 37 30
41 27 26
45 7 38
50 23 22
45 24 23
41 25 24
45 27 41
45 28 27
45 30 29
43 31 37
43 37 36
37 31 30
44 33 32
40 38 1
45 38 30
38 7 1
40 39 38
41 26 25
45 41 24
42 13 12
48 14 42
43 36 35
43 32 31
44 34 33
44 32 43
45 29 28
50 47 45
46 2 1
46 6 4
47 8 7
47 12 11
48 15 14
48 21 16
49 48 12
50 21 49
50 49 47
50 45 23
数据可生成如下所示图像:

img

我自己做出来了代码:
利用有向三角形的定义,查找三角形三个边重复数,将单数的线段提取,代入数据即可,最后用plot生成图像。
欢迎大家继续交流。谢谢!

您的问题解决了嘛,错误使用triangulation可能是参数或者参数类型的问题。具体还报了什么其它的错误呢。不知道您的问题是否已经解决了呢。。

都是高手

在 MATLAB 中,可以使用函数 convhull 来寻找二维散点的凸包。函数 convhull 使用卷积算法来求解凸包问题。

下面是一个示例代码,它使用随机生成的二维散点来演示如何使用 convhull 函数:

% 生成散点
x = rand(100, 1);
y = rand(100, 1);

% 求解凸包
k = convhull(x, y);

% 绘制凸包
plot(x(k), y(k), 'r-', x, y, 'b.')


其中,x,y是散点的坐标,k是凸包上的点的索引。

如果要寻找凹包,可以使用函数 alphaShape 。下面是一个示例代码,使用随机生成的二维散点来演示如何使用 alphaShape 函数:

% 生成散点
x = rand(100, 1);
y = rand(100, 1);

% 求解凹包
shp = alphaShape(x, y);

% 绘制凹包
plot(shp)


其中,x,y是散点的坐标,shp是凹包对象。可以使用plot(shp)来绘制凹包,可以使用shp.Alpha来调整凹包的形状。

如果希望寻找凸包和凹包,可以使用convhulln来寻找凸包,使用alphaShape来寻找凹包。
希望对你有帮助,望采纳。

码字不易,望采纳,谢谢!
楼主可以使用MATLAB中的凸包函数convhull来寻找凸包。

首先,读取散点坐标和三角划分行序号,并将它们存储在矩阵中。

然后,使用convhull函数寻找凸包。convhull函数接受一个二维点的矩阵作为输入,并返回一个表示凸包边界上点的索引。

示例代码如下:

% 读取散点坐标和三角划分行序号
points = load('points.txt');
tri = load('tri.txt');

% 寻找凸包
boundary = convhull(points);

% 绘制凸包
plot(points(boundary, 1), points(boundary, 2), 'r-', 'LineWidth', 2);
hold on;
trisurf(tri, points(:, 1), points(:, 2), points(:, 3));

上面代码首先将散点坐标和三角划分行序号读取到矩阵中,然后使用convhull函数寻找凸包,最后使用plot函数绘制凸包。

注意: convhull函数默认使用qhull算法来寻找凸包,qhull算法可以处理凸和凹凸包。

您也可以使用其他算法如Graham算法,Graham算法只能处理凸包。

最后,使用trisurf函数绘制三角划分图,并将它与凸包一起显示。
需要注意的是,如果你想要找凹包的话, 可以使用alphaShape函数。这个函数能够通过alpha值来调整凹包的形状,alpha值越小,凹包越凸,alpha值越大,凹包越凹。

示例代码如下:

% 创建alphaShape对象
alpha_shape = alphaShape(points, alpha);

% 绘制凹包
plot(alpha_shape)
hold on;
trisurf(tri, points(:, 1), points(:, 2), points(:, 3));

上面代码中,alpha是一个可选参数,表示alpha值。如果不指定alpha值,函数会自动计算一个合适的alpha值。

在这个例子中, 我们将alpha值设置为0.5, 这样可以得到一个较为凹陷的凹包。

同样的,您可以使用plot函数绘制凹包,并使用hold on;来绘制三角划分图,将它们一起显示。

需要注意的是,alphaShape函数需要使用Mapping Toolbox,在没有这个工具箱的情况下是无法使用的。

总之,可以使用convhull函数寻找凸包,使用alphaShape函数寻找凹包,并使用plot和trisurf函数将它们绘制出来。希望这些信息能帮助您解决问题。

望采纳!!!点击回答右侧采纳即可!
研究思路:
1.首先,根据给定的散点坐标和三角划分序号,可以使用MATLAB中的函数triplot绘制出三角划分图;
2.然后,根据三角划分图,可以使用MATLAB中的函数convhull绘制出凹凸包;
3.最后,根据凹凸包,可以使用MATLAB中的函数boundary绘制出外边界凹凸包。
MATLAB代码:

%!给(MISSING)定散点坐标
x = [0.940 0.598 0.427 1.111 2.137 2.991 4.017 4.957 6.068 6.923 7.094 7.521 7.949 8.291 9.316 9.658 10.000 9.829 9.316 8.632 8.120 7.692 7.436 7.521 6.581 6.239 5.385 4.530 3.675 2.821 1.966 1.111 0.684 0.342 0.171 0.769 0.940 0.000 0.256 6.709 7.906 1.309 1.122 4.575 1.464 5.938 8.486 7.413 6.470];
y = [6.325 7.179 7.607 8.034 8.718 8.034 7.350 8.034 8.718 8.034 7.350 6.752 7.179 7.179 6.325 5.470 4.615 3.761 2.906 2.906 3.248 2.906 2.051 1.197 0.342 0.000 0.085 0.342 0.769 1.197 2.051 2.906 3.761 4.615 5.470 6.709 6.966 1.480 0.786 3.387 7.428 5.655 5.501 4.991 3.839];
%!给(MISSING)定三角划分序号
tri = [49 21 48; 46 1 6; 46 4 3; 46 3 2; 44 35 34; 44 43 35; 6 5 4; 47 7 45; 7 6 1; 47 10 9; 47 11 10; 47 9 8; 21 20 18; 48 16 15; 50 22 21; 42 14 13; 48 42 12; 20 19 18; 21 17 16; 21 18 17; 49 12 47; 38 37 30; 41 27 26; 45 7 38; 50 23 22; 45 24 23; 41 25 24; 45 27 41; 45 28 27; 45 30 29; 43 31 37; 43 37 36; 37 31 30; 44 33 32; 40 38 1; 45 38 30; 38 7 1; 40 39 38; 41 26 25; 45 41 24; 42 13 12; 48 14 42; 43 36 35; 43 32 31; 44 34 33; 44 32 43; 45 29 28; 50 47 45; 46 2 1; 46 6 4; 47 8 7; 47 12 11; 48 15 14; 48 21 16; 49 48 12; 50 21 49; 50 49 47; 50 45 23];
%!绘(MISSING)制三角划分图
triplot(tri,x,y);
%!绘(MISSING)制凹凸包
hold on;
k = convhull(x,y);
plot(x(k),y(k),'r-');
%!绘(MISSING)制外边界凹凸包
hold on;
b = boundary(x,y);
plot(x(b),y(b),'g-');