@maplat/edgeruler
Version:
A small library for dual-constraining a Delaunator triangulation
158 lines (103 loc) • 5.2 kB
Markdown
# MaplatEdgeRuler
Maplat EdgeRulerは、[Delaunator](https://github.com/mapbox/delaunator)を基盤として、様々な制約を含んだ三角網を生成するためのライブラリです。
English README is [here](./README.md).
## 特徴
- Delaunatorの出力に対して、エッジ制約を適用
- 複数の制約タイプをサポート
- 必須エッジ制約(v0.1.0で実装済み)
- 不許可エッジ制約(v0.3.0で実装予定)
- 高速なアルゴリズムと効率的なメモリ使用
- TypeScriptで実装され、型定義を完備
## インストール
### npm
```sh
# メインパッケージのインストール
npm install @maplat/edgeruler
# 利用に必要な前提パッケージをインストール
npm install delaunator
```
### JSR (JavaScript Registry)
```sh
# Deno向け
deno add @maplat/edgeruler
# npm/Node.js向け
npx jsr add @maplat/edgeruler
npm install delaunator # ピア依存関係
```
### Deno
```typescript
import EdgeRuler from "https://deno.land/x/maplat_edgeruler/mod.ts";
// または特定のバージョンから
// import EdgeRuler from "https://deno.land/x/maplat_edgeruler@v0.2.0/mod.ts";
```
注意: プロジェクトには依存関係のインポートマップを含む`deno.json`設定ファイルが含まれています。ソースから直接モジュールを使用する場合は、別の`import_map.json`も使用できます:
```bash
deno run --import-map=import_map.json your_script.ts
```
### ブラウザ
Maplat EdgeRulerをインストールする前に、以下の前提ライブラリを読み込んでおく必要があります。
```html
<!-- 前提ライブラリ -->
<script src="https://unpkg.com/delaunator/delaunator.min.js"></script>
<!-- そしてMaplat EdgeRulerをロード -->
<script src="https://unpkg.com/@maplat/edgeruler/dist/maplat_edgeruler.umd.js"></script>
```
## 使い方
### 必須エッジ制約 (v0.1.0)
```typescript
import Delaunator from "delaunator";
import EdgeRuler from "@maplat/edgeruler";
// 点群データの定義
const points = [[150, 50], [50, 200], [150, 350], [250, 200]];
// Delaunator による初期三角網の生成
const del = Delaunator.from(points);
// 制約付き三角網の生成
const con = new EdgeRuler(del);
// 必須エッジの追加(例:頂点0と頂点2を結ぶエッジ)
con.constrainOne(0, 2);
// 複数の必須エッジを一括追加
const edges = [[0, 1], [1, 2], [2, 3]];
con.constrainAll(edges);
// 制約付き三角網の結果はdelプロパティとして取得可能
const constrainedDel = con.del;
```
#### 制約条件
入力データは以下の条件を満たす必要があります:
- 点群に重複する座標が存在しないこと
- 制約エッジ同士が交差しないこと
- 制約エッジが、その端点以外の点と交差しないこと
- 三角網の外周が凸包を形成すること
- 三角網に穴が存在しないこと
最後の2つの条件はDelaunatorによって保証されますが、三角網を修正する際には注意が必要です。
#### アルゴリズム
基本的なアプローチ:
- まず通常のドロネー三角分割を構築(Delaunatorを使用)
- 指定された制約エッジの追加処理
- 制約エッジと交差する既存のエッジを検出して除去
- 制約エッジを維持しながら、可能な限りドロネー条件を満たすように最適化
このアルゴリズムは、以下の論文を参考にしています:
- [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)
#### パフォーマンス
- 点数Nに対してほぼ線形の実行時間(O(N))を実現
- ビットセット(BitSet)を活用して効率的なメモリ使用を実現
- 制約付加による追加コストは通常10%未満
### 将来の拡張予定 (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); // 不許可エッジの定義
const forbidDel = fbd.del; // 制約結果の三角網
```
## ライセンス
MIT License
Copyright (c) 2024 Code for History
### 開発者
- Kohei Otsuka
- Code for History
### クレジット
- このライブラリは[@kninnug/constrainautor 4.0.0](https://github.com/kninnug/Constrainautor/)を基に開発されています
- 制約アルゴリズムは S. W. Sloan の論文を参考にしています
- [robust-predicates](https://github.com/mourner/robust-predicates) (Jonathan Shewchukの幾何計算アルゴリズムのポート) を使用しています
あなたの貢献をお待ちしていますは大歓迎です。