Contenido principal

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

polygonDecomposition

Descomponer un polígono en polígonos no superpuestos

Desde R2025a

    Descripción

    polySet = polygonDecomposition(poly) descompone un polígono en un conjunto de polígonos no superpuestos cuya unión es equivalente al polígono original utilizando el algoritmo de descomposición del bustrofedón. Los polígonos de salida tienen bordes convexos o bordes verticales izquierdo y derecho, lo que le permite barrer la totalidad del polígono original en una sola pasada utilizando un patrón de barrido vertical.

    ejemplo

    [polySet,solnInfo] = polygonDecomposition(poly) devuelve información de la solución de descomposición, como los vértices y si esos vértices están o no en los agujeros del polígono original.

    [___,solnInfo] = polygonDecomposition(poly,options) también especifica las opciones del algoritmo de descomposición y devuelve cualquier combinación de argumentos de salida de sintaxis anteriores. Para devolver un gráfico de conectividad de los polígonos no superpuestos de la descomposición como un campo en el argumento de salida solnInfo, la propiedad ReturnConnectivity de options debe ser true o 1.

    ejemplo

    Ejemplos

    contraer todo

    Cargue los vértices del polígono y utilice los vértices para crear un objeto polyshape.

    load("exampleSimplePolygonVertices.mat","verticesX","verticesY")
    p = polyshape(verticesX,verticesY);

    Realice la descomposición de polígonos con el algoritmo y las opciones predeterminadas.

    polySet = polygonDecomposition(p);

    Traza el polígono original y el polígono descompuesto uno al lado del otro.

    tiledlayout(1,2,TileSpacing="loose")
    nexttile
    plot(p)
    title(["Original Polygon","Containing Concave Hole"])
    nexttile
    plot(polySet)
    title(["Nonoverlapping","Decomposed Polygons"])

    Figure contains 2 axes objects. Axes object 1 with title Original Polygon Containing Concave Hole contains an object of type polygon. Axes object 2 with title Nonoverlapping Decomposed Polygons contains 5 objects of type polygon.

    Cargue un polyshape y grafíquelo.

    load("exampleComplexPolyshape.mat","p")
    plot(p)
    title("Original Polygon")

    Figure contains an axes object. The axes object with title Original Polygon contains an object of type polygon.

    Descomponga el polígono utilizando cada método de reconexión.

    bOpts1 = boustrophedonOptions(ReconnectionMethod="nearest");
    [polySet1,info1] = polygonDecomposition(p,bOpts1);
    bOpts2 = boustrophedonOptions(ReconnectionMethod="none");
    [polySet2,info2] = polygonDecomposition(p,bOpts2);
    bOpts3 = boustrophedonOptions(ReconnectionMethod="all");
    [polySet3,info3] = polygonDecomposition(p,bOpts3);

    Muestre la descomposición poligonal con una superposición de gráfico de conectividad para cada método de reconexión.

    plot(polySet1)
    hold on
    exampleHelperShowGraphConnectionsOnPolyset(polySet1,info1.Connectivity,0.5);
    title("Polygon Decomposition with Connection Graph");
    subtitle("ReconnectionMethod=''nearest''")
    hold off

    Figure contains an axes object. The axes object with title Polygon Decomposition with Connection Graph contains 10 objects of type polygon, graphplot.

    plot(polySet2)
    hold on
    exampleHelperShowGraphConnectionsOnPolyset(polySet2,info2.Connectivity,0.5);
    title("Polygon Decomposition with Connection Graph");
    subtitle("ReconnectionMethod=''none''");
    hold off

    Figure contains an axes object. The axes object with title Polygon Decomposition with Connection Graph contains 10 objects of type polygon, graphplot.

    plot(polySet3)
    hold on
    exampleHelperShowGraphConnectionsOnPolyset(polySet3,info3.Connectivity,0.5);
    title("Polygon Decomposition with Connection Graph");
    subtitle("ReconnectionMethod=''all''");
    hold off

    Figure contains an axes object. The axes object with title Polygon Decomposition with Connection Graph contains 10 objects of type polygon, graphplot.

    Esta es la función auxiliar para trazar la descomposición del polígono y superponer el gráfico de conectividad.

    function gHandle = exampleHelperShowGraphConnectionsOnPolyset(polySet,connectionGraph,lineWidth)
    
        % Get the current axes
        ax = gca;
        ax.ColorOrderIndex = 1; % Reset the color order index
    
        % Overlay the connectivity graph
        gHandle = show(connectionGraph);
        gHandle.EdgeAlpha = 0.75;
        gHandle.LineWidth = lineWidth; % Set the line width for the graph edges
    
        % Calculate and plot the centroids
        [cx,cy] = centroid(polySet);
    
        % Set the xy-positions of the connectivity graph to the centroids of 
        % the polygons
        gHandle.XData = cx';
        gHandle.YData = cy';
    end
    

    La función polygonDecomposition le permite planificar rutas de cobertura de UAV teniendo en cuenta las áreas que no necesita incluir en las rutas de cobertura.

    Primero, cargue el polígono como un polyshape que representa la región a inspeccionar y descomponga el polígono en polígonos convexos no superpuestos.

    load("exampleCoveragePlanningPolyshape.mat","p")
    polySet = polygonDecomposition(p);

    Extraiga los vértices de cada polígono descompuesto y almacénelos en un arreglo de celdas.

    polygonVertices = cell(numel(polySet),1);
    for i = 1:numel(polySet)
        polygonVertices{i} = polySet(i).Vertices;
    end

    Cree un objeto uavCoverageSpace con los vértices del polígono descompuesto y visualice el espacio de cobertura.

    space = uavCoverageSpace(Polygons=polygonVertices);
    ax = show(space,FontSize=1,LineWidth=0.25);
    title("UAV Coverage Space");
    axis padded

    Figure contains an axes object. The axes object with title UAV Coverage Space contains 10 objects of type polygon, text.

    space.UnitWidth = 0.4; % Sensor footprint width

    Cree un objeto uavCoveragePlanner. Especifique las posiciones de despegue y aterrizaje y luego planifique la ruta de cobertura.

    planner = uavCoveragePlanner(space);
    takeoff = [0 0 0];
    landing = [0 -4 0];
    path = plan(planner,takeoff,landing);

    Visualice la ruta planificada en el espacio de cobertura.

    hold on
    ax.ColorOrderIndex=1;
    h1 = scatter(takeoff(1),takeoff(2),"filled");
    h2 = scatter(landing(1),landing(2),"filled");

    Trazar la ruta de cobertura planificada.

    ax.ColorOrderIndex=4;
    plot(path(:,1),path(:,2),LineWidth=1.25)
    legend([h1 h2],"Takeoff","Landing",Location="southeast")
    title("Coverage Path")
    hold off

    Figure contains an axes object. The axes object with title Coverage Path contains 13 objects of type polygon, text, scatter, line. These objects represent Takeoff, Landing.

    Argumentos de entrada

    contraer todo

    Polígono a descomponer, especificado como un objeto polyshape.

    Ejemplo: polyshape([0 0 1 1],[1 0 0 1]) crea un cuadrado sólido definido por los cuatro puntos (0,1), (0,0), (1,0) y (1,1).

    Opciones del algoritmo de descomposición, especificadas como un objeto boustrophedonOptions. De forma predeterminada, polygonDecomposition utiliza un objeto boustrophedonOptions con la propiedad ReturnConnectivity establecida en false y otras propiedades establecidas en sus valores predeterminados.

    Ejemplo: boustrophedonOptions(ReconnectionMethod="nearest")

    Argumentos de salida

    contraer todo

    Polígonos no superpuestos descompuestos, devueltos como un arreglo de N elementos de objetos polyshape. N es el número total de polígonos generados a partir de la descomposición de poly.

    Información de la solución de descomposición, devuelta como una estructura con estos campos:

    • Vertices — Vértices de los polígonos descompuestos, devueltos como una matriz M por 2. Cada fila es la coordenada xy de un vértice, y M es el número total de vértices de los polígonos descompuestos.

    • VertexOnHole — Estado de los vértices del polígono descompuesto, devuelto como un vector columna de elementos M de valores lógicos. Cada elemento corresponde a un vértice en el campo Vertices. Por ejemplo, si el valor de VertexOnHole(2) es 1, entonces el vértice en Vertices(2) define un agujero o área no transitable.

    • Connectivity — Gráfico de conectividad entre los polígonos no superpuestos descompuestos, devuelto como un objeto navGraph. Para generar Connectivity, debe especificar el argumento options como un objeto boustrophedonOptions con la propiedad ReturnConnectivity establecida en true o 1.

    Referencias

    [1] Choset, Howie. "Coverage of Known Spaces: The Boustrophedon Cellular Decomposition." Autonomous Robots 9, no.3 (2000): 247–53. https://doi.org/10.1023/A:1008958800904.

    Capacidades ampliadas

    expandir todo

    Generación de código C/C++
    Genere código C y C++ mediante MATLAB® Coder™.

    Historial de versiones

    Introducido en R2025a

    Consulte también

    |