www.gusucode.com > matlab 案例源码 matlab代码程序 > matlab/UsingTheDelaunayTriangulationClassExample.m
%% Using the delaunayTriangulation Class % Copyright 2015 The MathWorks, Inc. %% Create, Query, and Edit Delaunay Triangulation % This example shows how to create, query, and edit a Delaunay % triangulation from the |seamount| data using |delaunayTriangulation|. The % seamount data set contains (|x|, |y|) locations and corresponding % elevations (|z|) that define the surface of the seamount. %% % Load and triangulate the (|x|, |y|) data. load seamount DT = delaunayTriangulation(x,y) %% % The |Constraints| property is empty because there aren't any imposed edge % constraints. The |Points| property represents the coordinates of the % vertices, and the |ConnectivityList| property represents the triangles. Together, these two properties define the matrix data for the triangulation. %% % The |delaunayTriangulation| class is a wrapper around the matrix data, % and it offers a set of complementary methods. You access the properties % in a |delaunayTriangulation| in the same way you access the fields of a struct. %% % Access the vertex data. DT.Points; %% % Access the connectivity data. DT.ConnectivityList; %% % Access the first triangle in the |ConnectivityList| property. DT.ConnectivityList(1,:) %% % |delaunayTriangulation| provides an easy way to index into the % |ConnectivityList| property matrix. %% % Access the first triangle. DT(1,:) %% % Examine the first vertex of the first triangle. DT(1,1) %% % Examine all the triangles in the triangulation. DT(:,:); %% % Indexing into the |delaunayTriangulation| output, |DT|, works like % indexing into the triangulation array output from |delaunay|. The % difference between the two are the extra methods that you can call on % |DT| (for example, |nearestNeighbor| and |pointLocation|). %% % Use |triplot| to plot the |delaunayTriangulation|. The |triplot| function is % not a |delaunayTriangulation| method, but it accepts and can plot a % |delaunayTriangulation|. triplot(DT); axis equal xlabel('Longitude'), ylabel('Latitude') grid on %% % Alternatively, you could use |triplot(DT(:,:), DT.Points(:,1), % DT.Points(:,2));| to get the same plot. %% % Use the |delaunayTriangulation| method, |convexHull|, to compute the % convex hull and add it to the plot. Since you already have a Delaunay % triangulation, this method allows you to derive the convex hull more % efficiently than a full computation using |convhull|. hold on k = convexHull(DT); xHull = DT.Points(k,1); yHull = DT.Points(k,2); plot(xHull,yHull,'r','LineWidth',2); hold off %% % You can incrementally edit the |delaunayTriangulation| to add or remove % points. If you need to add points to an existing triangulation, then an % incremental addition is faster than a complete retriangulation of the % augmented point set. Incremental removal of points is more efficient when % the number of points to be removed is small relative to the existing % number of points. %% % Edit the triangulation to remove the points on % the convex hull from the previous computation. figure plot(xHull,yHull,'r','LineWidth',2); axis equal xlabel('Longitude'),ylabel('Latitude') grid on % The convex hull topology duplicates the start and end vertex. % Remove the duplicate entry. k(end) = []; % Now remove the points on the convex hull. DT.Points(k,:) = [] % Plot the new triangulation hold on triplot(DT); hold off %% % There is one vertex that is just inside the boundary of the convex hull % that was not removed. The fact that it is interior to the hull can be % seen using the Zoom-In tool in the figure. You could plot the vertex % labels to determine the index of this vertex and remove it from the % triangulation. Alternatively, you can use the |nearestNeighbor| method to identify the index more readily. %% % The point is close to location (211.6, -48.15) % Use the nearestNeighbor method to find the nearest vertex. vertexId = nearestNeighbor(DT, 211.6, -48.15) %% % Now remove that vertex from the triangulation. DT.Points(vertexId,:) = [] %% % Plot the new triangulation. figure plot(xHull,yHull,'r','LineWidth',2); axis equal xlabel('Longitude'),ylabel('Latitude') grid on hold on triplot(DT); hold off %% % Add points to the existing triangulation. % Add 4 points to form a rectangle around the triangulation. Padditional = [210.9 -48.5; 211.6 -48.5; ... 211.6 -47.9; 210.9 -47.9]; DT.Points(end+(1:4),:) = Padditional %% % Close all existing figures. close all %% % Plot the new triangulation. figure plot(xHull,yHull,'r','LineWidth',2); axis equal xlabel('Longitude'),ylabel('Latitude') grid on hold on triplot(DT); hold off %% % You can edit the points in the triangulation to move them to a new location. % Edit the first of the additional point set (the vertex ID 274). DT.Points(274,:) = [211 -48.4]; %% % Close all existing figures. close all %% % Plot the new triangulation figure plot(xHull,yHull,'r','LineWidth',2); axis equal xlabel('Longitude'),ylabel('Latitude') grid on hold on triplot(DT); hold off %% % Use the a method of the |triangulation| class, |vertexAttachments|, to find the attached triangles. Since the number of triangles attached to a vertex is variable, the method returns the attached triangle IDs in a cell array. You need braces to extract the contents. attTris = vertexAttachments(DT,274); hold on triplot(DT(attTris{:},:),DT.Points(:,1),DT.Points(:,2),'g') hold off %% % |delaunayTriangulation| also can be used to triangulate points in 3-D space. The resulting triangulation is composed of tetrahedra. %% Create and Plot Delaunay Triangulation of 3-D Points % This example shows how to use a |delaunayTriangulation| to create and % plot the triangulation of 3-D points. P = gallery('uniformdata',30,3,0); DT = delaunayTriangulation(P) faceColor = [0.6875 0.8750 0.8984]; tetramesh(DT,'FaceColor', faceColor,'FaceAlpha',0.3); %% % The |tetramesh| function plots both the internal and external faces of % the triangulation. For large 3-D triangulations, plotting the internal % faces might be an unnecessary use of resources. A plot of the boundary % might be more appropriate. You can use the |freeBoundary| method to get % the boundary triangulation in matrix format. Then pass the result to % |trimesh| or |trisurf|.