UNPKG

@maplat/edgeruler

Version:

A small library for dual-constraining a Delaunator triangulation

158 lines (103 loc) 4.68 kB
# MaplatEdgeRuler Maplat EdgeRuler is a library for generating constrained triangulations based on [Delaunator](https://github.com/mapbox/delaunator). 日本語のREADMEは[こちら](./README.ja.md) ## Features - Applies edge constraints to Delaunator output - Supports multiple constraint types: - Required edge constraints (implemented in v0.1.0) - Forbidden edge constraints (planned for v0.3.0) - Fast algorithm with efficient memory usage - Implemented in TypeScript with complete type definitions ## Installation ### npm ```sh # Install the main package npm install @maplat/edgeruler # Install the required peer dependency npm install delaunator ``` ### JSR (JavaScript Registry) ```sh # For Deno deno add @maplat/edgeruler # For npm/Node.js npx jsr add @maplat/edgeruler npm install delaunator # peer dependency ``` ### Deno ```typescript import EdgeRuler from "https://deno.land/x/maplat_edgeruler/mod.ts"; // or from a specific version // import EdgeRuler from "https://deno.land/x/maplat_edgeruler@v0.2.0/mod.ts"; ``` Note: The project includes a `deno.json` configuration file with import maps for dependencies. If you're using the module directly from source, you can also use the separate `import_map.json`: ```bash deno run --import-map=import_map.json your_script.ts ``` ### Browser Before installing Maplat EdgeRuler, you need to load the following prerequisite library: ```html <!-- Prerequisite library --> <script src="https://unpkg.com/delaunator/delaunator.min.js"></script> <!-- Then load Maplat EdgeRuler --> <script src="https://unpkg.com/@maplat/edgeruler/dist/maplat_edgeruler.umd.js"></script> ``` ## Usage ### Required Edge Constraints (v0.1.0) ```typescript import Delaunator from "delaunator"; import EdgeRuler from "@maplat/edgeruler"; // Define point data const points = [[150, 50], [50, 200], [150, 350], [250, 200]]; // Generate initial triangulation using Delaunator const del = Delaunator.from(points); // Create constrained triangulation const con = new EdgeRuler(del); // Add a required edge (e.g., connecting vertex 0 and vertex 2) con.constrainOne(0, 2); // Add multiple required edges at once const edges = [[0, 1], [1, 2], [2, 3]]; con.constrainAll(edges); // The constrained triangulation result is available in the del property const constrainedDel = con.del; ``` #### Constraints Input data must satisfy the following conditions: - No duplicate coordinates in the point set - No intersections between constraint edges - Constraint edges must not intersect with points other than their endpoints - The outer boundary of the triangulation must form a convex hull - The triangulation must not contain holes The last two conditions are guaranteed by Delaunator, but care must be taken when modifying the triangulation. #### Algorithm Basic approach: - First, construct a regular Delaunay triangulation (using Delaunator) - Process and add the specified constraint edges - Detect and remove existing edges that intersect with constraint edges - Optimize to satisfy the Delaunay condition as much as possible while maintaining constraint edges This algorithm is based on the following paper: - [A fast algorithm for generating constrained Delaunay triangulations, 1992, S. W. Sloan](https://web.archive.org/web/20210506140628if_/https://www.newcastle.edu.au/__data/assets/pdf_file/0019/22519/23_A-fast-algortithm-for-generating-constrained-Delaunay-triangulations.pdf) #### Performance - Achieves near-linear execution time O(N) for N points - Efficient memory usage through BitSet implementation - Additional cost for constraints typically less than 10% ### Future Extensions (v0.3.0) ```typescript import Delaunator from "delaunator"; import {Forbid} from "@maplat/edgeruler"; const del = Delaunator.from(points); const fbd = new Forbid(del); fbd.forbidAll(forbidEdges); // Define forbidden edges const forbidDel = fbd.del; // Get constrained triangulation result ``` ## License MIT License Copyright (c) 2024 Code for History ### Developers - Kohei Otsuka - Code for History ### Credits - This library is based on [@kninnug/constrainautor 4.0.0](https://github.com/kninnug/Constrainautor/) - The constraint algorithm is based on S. W. Sloan's paper - Uses [robust-predicates](https://github.com/mourner/robust-predicates) (a port of Jonathan Shewchuk's geometric computation algorithms) We welcome your contributions! Feel free to submit [issues and pull requests](https://github.com/code4history/MaplatEdgeRuler/issues).