map/archive/generated-history/STEP7_NOTES.md
2026-08-08 17:41:30 +09:00

5.9 KiB
Raw Blame History

Step 7 実装・検証記録

対象

Step 6 の生成結果で確認された次の問題を修正した。

  1. 追加生成が 2030 秒以上かかる
  2. 海岸・道路・行政形状がラッソ外周に追従する
  3. 既存の都道府県名が 県域N に置き換わる、または既存領域の行政境界が広く消える

1. 追加生成の高速化

Step 6 は地形候補を 6 件作り、完全な初期生成パイプラインを通常 2 件、条件次第で 3 件実行していた。人文地理・行政・交通の全段階を複数回実行することが主要な遅延原因だった。

Step 7 では次の構成へ変更した。

  • 軽量な本番地形候補: 2 件を基本、両方が不合格の場合のみ 3 件目
  • 完全な初期生成パイプライン: 最良地形に対して 1 回だけ
  • 最終的な海陸率、地名密度、集落密度、交通・境界品質の検査は維持
  • 候補キャッシュは従来どおり使用

生成モードは次に変更した。

expansion-production-fast-natural

品質ポリシーは次の識別子を使用する。

step7-fast-natural-expansion-v1

計測結果

STEP7_VALIDATION.mjs による追加生成部分だけの実測値:

ケース 地形候補 完全候補 追加生成時間
瀬戸内海型 2 1 6.08 秒
Auto 2 1 8.19 秒

実行環境の負荷により変動するが、検証ケースでは両方とも 10 秒以内だった。初期マップ生成時間は上記に含まない。

2. ラッソ外周への追従を抑制

仮想拡大フレーム

初期生成器はマップ外周を海へ落とす設計を含む。Step 6 では候補マップの外周が追加選択範囲の外周付近へ写像されるため、海岸がラッソ形状に沿いやすかった。

Step 7 では追加生成候補を、1.55 倍の仮想本番マップから切り出した中央クロップとして生成する。これにより、初期生成器の意図的な「マップ端の海」がラッソ端へ直接現れない。

  • 地形ノイズは従来どおり絶対ワールド座標を使用
  • 海岸・山系に使用する正規化座標だけを仮想拡大フレームへ変換
  • 候補ごとに小さな決定論的フレームオフセットを使用

外周フェザー

ラッソ外周のアルファを、数セル幅の均一な内向きフェザーから、広域・中域・詳細のワールド座標ノイズを合成した不規則な深度へ変更した。これにより、海岸や土地利用境界が選択線と平行に続く傾向を弱める。

外部交通の抑制

初期生成向けの次の候補レイヤーは、追加生成では取り込まない。

  • externalGateways
  • externalRoads
  • externalRailways
  • externalExpressways

これらは本来、初期マップの画面外接続を表すため、追加領域へ移植すると道路・鉄道がラッソ上端・下端へ直進する原因になる。既存マップとの接続は Step 4 の交通ポータルで保証する。

検証では、生成された交通線の端点が旧世界との実シームではない外周 4 セル以内に現れた数は、瀬戸内海型で 1、Auto で 0 だった。

3. 行政名と既存境界の保護

既存行政フィールドの復元

Expansion でも修復領域内の次のフィールドだけを軽量スナップショットするよう変更した。

  • adminId
  • municipalityId
  • prefectureRegionId
  • prefectureMask

パッチアルファが 0 の旧領域は行政トポロジー整理後に復元する。これにより、修復矩形が既存領域へ広がっても、選択外の県・市町村IDが統合・消去されない。

行政名のID固定

パッチ前の adminCentersprefectureRegions をID別に保存し、整合化後も同じIDには元の名称を戻す。ラベル位置が再計算されても名称は維持される。

新規候補については、最終IDラスター内に存在する行政IDに対応する候補メタデータを、候補ラベル点が選択範囲外にあっても補完する。これにより 県域N へのフォールバックを防止する。

境界再構築範囲

Step 5 の境界再構築は prefectureMask 内だけを対象にしていたため、周辺県の境界が消えていた。Step 7 では次の正本から世界全体の陸上境界を再構築する。

  • 市町村境界: 最終 adminId の差、かつ同一 prefectureRegionId
  • 都道府県境界: 最終 prefectureRegionId の差
  • 対象範囲: 海以外の全セル

prefectureMask は注目県の外周レイヤーにだけ引き続き使用する。

検証

実行:

node STEP7_VALIDATION.mjs

最終確認結果:

setouchi
  expansion: 6.08 s
  terrain attempts: 2
  full attempts: 1
  old prefecture names preserved: 3
  generic prefecture names: 0
  outer-edge transport endpoints: 1

auto
  expansion: 8.19 s
  terrain attempts: 2
  full attempts: 1
  old prefecture names preserved: 3
  generic prefecture names: 0
  outer-edge transport endpoints: 0

両ケースで以下を確認した。

  • 最終品質ゲート: PASS
  • 道路ポータル切断: 0
  • 鉄道ポータル切断: 0
  • 二重行政境界: 0
  • 既存都道府県名の変更・消失: 0
  • 県域N フォールバック: 0
  • 市町村境界ベクトルが全陸上の最終ID差分と完全一致
  • 都道府県境界ベクトルが全陸上の最終ID差分と完全一致
  • 追加候補由来の外部道路・外部鉄道・外部高速道路・外部ゲートウェイ: 0

全 JavaScript / MJS ファイルは node --check を通過した。

既存の総合 test.js はこの実行環境で 180 秒以内に完了しなかったため、総合スイート完走は確認できていない。Step 7 専用回帰テストは完走している。