From 2d9d920fcf1c084ebab1367fbb3085e746656b05 Mon Sep 17 00:00:00 2001 From: INARI_DARKFOX <39549290+inaridarkfox4231@users.noreply.github.com> Date: Wed, 26 Jun 2024 09:34:56 +0900 Subject: [PATCH] =?UTF-8?q?createDisjointPaths=E3=81=ABoutput=E3=81=AEopti?= =?UTF-8?q?on=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/fisceToyBox.js | 105 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 98 insertions(+), 7 deletions(-) diff --git a/src/fisceToyBox.js b/src/fisceToyBox.js index 1b11322..e995f17 100644 --- a/src/fisceToyBox.js +++ b/src/fisceToyBox.js @@ -32,6 +32,7 @@ p5依存です ごめんなさい createDisjointPathsは出力形式を変えるoptionがあってもいいかもしれない。 + optionを追加しました。{output:"cycle_vertices"}ってやるとサイクルの頂点列がそのまま返ります。 */ const fisceToyBox = (function(){ @@ -664,7 +665,20 @@ const fisceToyBox = (function(){ /* createDisjointPaths(contours, mergeThreshold=1e-9) contours: p5のベクトル列の配列。すべて閉路であることが前提。交叉については自由。自己交叉もOK. - mergeThreshold: 点をまとめる際のマージの基準 default:1e-9 + options: + mergeThreshold: 点をまとめる際のマージの基準 default:1e-9 + output: アウトプットの形式について + "default": デフォルト。そのまま返る。頂点に関しては接続辺などの情報もあるので、 + その辺りで何かしたい場合は有用。 + "island_vertexIndices": {islands, vertices}が返る。islandsにはislandがインデックス配列の形で入ってる。 + verticesはp5のベクトル列で、インデックスからこれを参照する。 + "island_vertices": {islands}が返る。配列の各元であるislandはすべてp5のベクトル列である。もちろんすべて正の向き。 + このままテッセレーションに持っていくこともできる(earcutなどして)。いわゆるsplitに相当する。 + (_triangulateはこのsplitが事実上実行不可能で大変な苦労を要した...昔の話。) + "cycle_vertexIndices": {cycles, vertices}が返る。cyclesにはcycleがインデックス配列の形で入ってる。 + verticesはp5のベクトル列で、インデックスからこれを参照する。 + "cycle_vertices": {cycles}が返る。配列の各元であるcycleはすべてp5のベクトル列である。 + このままcyclesToCyclesにもっていってさらにearcutでメッシュを作ったりできる。 入力はいわゆる2次元のベクトル列です。 3次元では使えないです。まあp5の_triangulateに比べたら劣化してるかもしれないけど どうでもいいですね。あれ使いづらいので。 @@ -692,7 +706,8 @@ const fisceToyBox = (function(){ cyclesにおいてそのindexのverticeのpを取り出す必要があるのよね */ - function createDisjointPaths(contours, mergeThreshold = 1e-9){ + function createDisjointPaths(contours, options = {}){ + const {mergeThreshold = 1e-9, output = "default"} = options; // cpCheckArrayをcontourの数だけ用意する const cpCheckArrays = new Array(contours.length); @@ -892,19 +907,19 @@ const fisceToyBox = (function(){ } } - const result = getUnionFind(allVertices.length, query); + const unionFindResult = getUnionFind(allVertices.length, query); const mergedVertices = []; const mergedEdges = []; - const uf = result.uf; + const uf = unionFindResult.uf; // ここでいうkがすなわちレベルになるね...lvにしよう - for(let lv=0; lv { + const resultVertices = []; + for(let i=0;i { + const resultIslands = []; + for(const island of islands){ + const resultIsland = []; + for(let i=0;i { + const resultVertices = []; + for(let i=0;i { + const resultCycles = []; + for(const cycle of cycles){ + const resultCycle = []; + for(let i=0;i