kairo-gokko (5) データの整形 4



今回は十字の部分について考えます。

<before>

f:id:sonota88:20200222132545p:plain

<after>

f:id:sonota88:20200222132610p:plain


つながってる十字とつながっていない十字の両方を使いたい場合、すぐに思いつく方法が2つあります。

  • (1) つなげたくない場合にブリッジを使う
  • (2) 点で指定

(1) ブリッジ方式

まず Oxygen Not Included のように、つなげたくない場合にブリッジを使う方式も検討しましたが、

  • 余分なスペースが必要になる
  • 作図が面倒になる(つなげたくない方が頻度が高いため)

という理由により、やめました。

参考までに、Oxygen Not Included の電線ブリッジはこんな感じのです↓

f:id:sonota88:20210923155724p:plain

f:id:sonota88:20210923155951p:plain


(2) 点指定方式

点指定方式の場合、2通り考えられます。

  • (2-1) つなげたい場合に指定する(何か印を付ける)
  • (2-2) つなげたくない場合に指定する

さっき書いたようにつなげたくない方が頻度が高いようだったので、 「(2-1) つなげたい場合に指定する」を採用しました。


というわけで「つなげたい場合に指定する」方式に決めましたが、つなげたい場合はあまり出てこないので、今回は「指定しない場合はつなげない」ようにすることだけを考えます。 つなげたい場合のことは必要になってからでも対応できると思います。たぶん。


--- a/viewer.rb
+++ b/viewer.rb
@@ -94,14 +94,26 @@ def take_edge(degree_map, pt_wfs_map, pt0, wf1)
   wf1.visit()
   wfs << wf1
 
+  prev_wf = wf1
   work_pt = wf1.opposite_pos(pt0)
 
   loop do
     next_wfs =
       if degree_map[work_pt] == 2
         pt_wfs_map[work_pt].select { |wf| ! wf.visited }
+      elsif degree_map[work_pt] == 4
+        pt_wfs_map[work_pt].select { |wf|
+          same_dir =
+            if prev_wf.tate?
+              wf.tate?
+            else
+              ! wf.tate?
+            end
+
+          ! wf.visited && same_dir
+        }
       else
-        # 次数が 2 以外の場合は次の経路なし
+        # 次数が 2, 4 以外の場合は次の経路なし
         []
       end
 
@@ -120,6 +132,7 @@ def take_edge(degree_map, pt_wfs_map, pt0, wf1)
     next_wf.visit()
     wfs << next_wf
 
+    prev_wf = next_wf
     work_pt = next_wf.opposite_pos(work_pt)
   end

WF を辿って次数 = 4 の点に来たときの挙動を変えました。

エッジ終端であるとみなしていたところを、さらに先に進むようにします。 その際、その点に来るために通ってきた WF と向き(縦 or 横)が同じ WF だけを次に進むべき経路として採用します。


あ、あと、開始点をリストアップするときに 次数 = 4 の点を除外しておかないといけないですね。

--- a/viewer.rb
+++ b/viewer.rb
@@ -61,7 +61,11 @@ def select_start_points(degree_map)
   pts = []
 
   degree_map.each { |pt, degree|
-    pts << pt if degree != 2
+    if degree == 2 || degree == 4
+      # 開始点ではない
+    else
+      pts << pt
+    end
   }
 
   pts