| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 | import Node from "./Node";import Edge from "./Edge";import EdgeRing from "./EdgeRing";import { FeatureCollection, LineString, MultiLineString, Feature } from "@turf/helpers";/** * Represents a planar graph of edges and nodes that can be used to compute a polygonization. * * Although, this class is inspired by GEOS's `geos::operation::polygonize::PolygonizeGraph`, * it isn't a rewrite. As regards algorithm, this class implements the same logic, but it * isn't a javascript transcription of the C++ source. * * This graph is directed (both directions are created) */export default class Graph {    private nodes;    private edges;    /**     * Creates a graph from a GeoJSON.     *     * @param {FeatureCollection<LineString>} geoJson - it must comply with the restrictions detailed in the index     * @returns {Graph} - The newly created graph     * @throws {Error} if geoJson is invalid.     */    static fromGeoJson(geoJson: FeatureCollection<LineString | MultiLineString> | LineString | MultiLineString | Feature<LineString | MultiLineString>): Graph;    /**     * Creates or get a Node.     *     * @param {number[]} coordinates - Coordinates of the node     * @returns {Node} - The created or stored node     */    getNode(coordinates: number[]): Node;    /**     * Adds an Edge and its symetricall.     *     * Edges are added symetrically, i.e.: we also add its symetric     *     * @param {Node} from - Node which starts the Edge     * @param {Node} to - Node which ends the Edge     */    addEdge(from: Node, to: Node): void;    constructor();    /**     * Removes Dangle Nodes (nodes with grade 1).     */    deleteDangles(): void;    /**     * Check if node is dangle, if so, remove it.     *     * It calls itself recursively, removing a dangling node might cause another dangling node     *     * @param {Node} node - Node to check if it's a dangle     */    _removeIfDangle(node: Node): void;    /**     * Delete cut-edges (bridge edges).     *     * The graph will be traversed, all the edges will be labeled according the ring     * in which they are. (The label is a number incremented by 1). Edges with the same     * label are cut-edges.     */    deleteCutEdges(): void;    /**     * Set the `next` property of each Edge.     *     * The graph will be transversed in a CW form, so, we set the next of the symetrical edge as the previous one.     * OuterEdges are sorted CCW.     *     * @param {Node} [node] - If no node is passed, the function calls itself for every node in the Graph     */    _computeNextCWEdges(node?: Node): void;    /**     * Computes the next edge pointers going CCW around the given node, for the given edgering label.     *     * This algorithm has the effect of converting maximal edgerings into minimal edgerings     *     * XXX: method literally transcribed from `geos::operation::polygonize::PolygonizeGraph::computeNextCCWEdges`,     * could be written in a more javascript way.     *     * @param {Node} node - Node     * @param {number} label - Ring's label     */    _computeNextCCWEdges(node: Node, label: number): void;    /**     * Finds rings and labels edges according to which rings are.     *     * The label is a number which is increased for each ring.     *     * @returns {Edge[]} edges that start rings     */    _findLabeledEdgeRings(): Edge[];    /**     * Computes the EdgeRings formed by the edges in this graph.     *     * @returns {EdgeRing[]} - A list of all the EdgeRings in the graph.     */    getEdgeRings(): EdgeRing[];    /**     * Find all nodes in a Maxima EdgeRing which are self-intersection nodes.     *     * @param {Node} startEdge - Start Edge of the Ring     * @returns {Node[]} - intersection nodes     */    _findIntersectionNodes(startEdge: Edge): Node[];    /**     * Get the edge-ring which starts from the provided Edge.     *     * @param {Edge} startEdge - starting edge of the edge ring     * @returns {EdgeRing} - EdgeRing which start Edge is the provided one.     */    _findEdgeRing(startEdge: Edge): EdgeRing;    /**     * Removes a node from the Graph.     *     * It also removes edges asociated to that node     * @param {Node} node - Node to be removed     */    removeNode(node: Node): void;    /**     * Remove edge from the graph and deletes the edge.     *     * @param {Edge} edge - Edge to be removed     */    removeEdge(edge: Edge): void;}
 |