mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#ifndef MINIMUMSPANNINGTREE_H
 | 
						|
#define MINIMUMSPANNINGTREE_H
 | 
						|
 | 
						|
#include <vector>
 | 
						|
#include <unordered_map>
 | 
						|
#include <unordered_set>
 | 
						|
 | 
						|
#include "Point.hpp"
 | 
						|
 | 
						|
namespace Slic3r
 | 
						|
{
 | 
						|
 | 
						|
/*!
 | 
						|
 * \brief Implements Prim's algorithm to compute Minimum Spanning Trees (MST).
 | 
						|
 *
 | 
						|
 * The minimum spanning tree is always computed from a clique of vertices.
 | 
						|
 */
 | 
						|
class MinimumSpanningTree
 | 
						|
{
 | 
						|
    /*!
 | 
						|
     * \brief Represents an edge of the tree.
 | 
						|
     *
 | 
						|
     * While edges are meant to be undirected, these do have a start and end
 | 
						|
     * point.
 | 
						|
     */
 | 
						|
    struct Edge {
 | 
						|
        /**
 | 
						|
         * The point at which this edge starts.
 | 
						|
         */
 | 
						|
        const Point start;
 | 
						|
 | 
						|
        /**
 | 
						|
         * The point at which this edge ends.
 | 
						|
         */
 | 
						|
        const Point end;
 | 
						|
    };
 | 
						|
public:
 | 
						|
    MinimumSpanningTree() = default;
 | 
						|
    /*!
 | 
						|
     * \brief Constructs a minimum spanning tree that spans all given vertices.
 | 
						|
     */
 | 
						|
    MinimumSpanningTree(std::vector<Point> vertices);
 | 
						|
 | 
						|
    /*!
 | 
						|
     * \brief Gets the nodes that are adjacent to the specified node.
 | 
						|
     * \return A list of nodes that are adjacent.
 | 
						|
     */
 | 
						|
    std::vector<Point> adjacent_nodes(Point node) const;
 | 
						|
 | 
						|
    /*!
 | 
						|
     * \brief Gets the leaves of the tree.
 | 
						|
     * \return A list of nodes that are all leaves of the tree.
 | 
						|
     */
 | 
						|
    std::vector<Point> leaves() const;
 | 
						|
 | 
						|
    /*!
 | 
						|
     * \brief Gets all vertices of the tree.
 | 
						|
     * \return A list of vertices of the tree.
 | 
						|
     */
 | 
						|
    std::vector<Point> vertices() const;
 | 
						|
 | 
						|
private:
 | 
						|
    using AdjacencyGraph_t = std::unordered_map<Point, std::vector<Edge>, PointHash>;
 | 
						|
    AdjacencyGraph_t adjacency_graph;
 | 
						|
 | 
						|
    /*!
 | 
						|
     * \brief Computes the edges of a minimum spanning tree using Prim's
 | 
						|
     * algorithm.
 | 
						|
     *
 | 
						|
     * \param vertices The vertices to span.
 | 
						|
     * \return An adjacency graph with for each point one or more edges.
 | 
						|
     */
 | 
						|
    AdjacencyGraph_t prim(std::vector<Point> vertices) const;
 | 
						|
};
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
#endif /* MINIMUMSPANNINGTREE_H */
 | 
						|
 |