メインコンテンツまでスキップ

縦動線の算術

段数も踏面も勾配も書かれない。領域と階高と「上る向き」の宣言だけから導かれる。

space /B2..B1/st stair X3..X3+2600 Y2..Y2+5400 name:避難階段 stair:N form:return
npx tsx src/cli.ts runs examples/basement/main.muro
B2→B1	lift	EV	/B2/ev
B2→B1	ramp	車路	rise 3700mm	return	slope 1/7.2	going 26800mm	/B2/ramp
B2→B1	stair	避難階段	rise 3700mm	return	21 risers of 176mm, tread 300mm	going 6000mm	/B2/st
B1→L1	lift	EV	/B1/ev
B1→L1	ramp	車路	rise 3700mm	return	slope 1/7.2	going 26800mm	/B1/ramp
B1→L1	stair	避難階段	rise 3700mm	return	21 risers of 176mm, tread 300mm	going 6000mm	/B1/st
L1→R	lift	EV	/L1/ev

21 段も 176mm も 300mm も 6000mm も、原本のどこにも書かれていない。以下がその算術である。

局所座標

走りの局所座標は t(進む向きに 0 から)と s(進行方向の左から)で測る。上る向き stair:N が t の向きを決め、s の向きはそこから従う。折返しの左右がここで決まる。

turn:L と書かれたときだけ L で、未記入も不正値も R である。

形が一つも生成されない条件

次のいずれかに当たると形は一つも生成されない。RUN01–05 / SUF04 が言葉にする。

  • 縦動線の宣言が 0 個か 2 個以上
  • 領域が単一矩形でない
  • レベルが特定できない
  • 昇降機以外で値が N/E/S/W でない / 昇降機で値が 1 でない
  • form:straightreturn 以外
  • 階段と斜路以外に form:return
  • 上のレベルが無い(昇降機を除く)
  • 乗り込みが全長を食う
  • 折返しの走り長が残らない

昇降機は上のレベルが無くても形を持つ — かごは同じレベルで閉じる。

乗り込みと段割り

走りは領域の縁からは始まらない。近端に乗り込みの帯が残り、そこが扉の開く場所になる。直階段では遠端にも残る。

乗り込みは踊り場ではなく階の床である。縁から走りを始めると、階段室の扉が段板に直接ぶつかる。奥行は entry:、無ければ ENTRY_LANDING(1100mm)。

usable = 全長 − entry            (form:return)
usable = 全長 − entry × 2        (form:straight)

段数    = max(2, ⌈階高 ÷ (riser: ?? 180)⌉)
蹴上げ  = 階高 ÷ 段数
踏面    = usable ÷ max(1, 段数 − 1)
勾配    = レベル差 ÷ 走り長

riser:蹴上げの上限であって蹴上げそのものではない。書いた値がそのまま出るのではなく、段数を決めるために使われ、蹴上げは階高を段数で割った実際の値になる。

折返し

幅を二分し、遠端に中間踊り場を置く。turn:R なら第一の走りが進行方向の左、turn:L なら右。二本の走りは同じ t の区間を占め、s だけが違う

段の分割は次で決まる。

k        = min(段数 − 1, max(1, round(段数 ÷ 2)))
踊り場の高さ = FL + k × 蹴上げ

round は半数を切り上げるので、奇数段では下の走りが一段多い。二本目は幾何としても逆向きで、t が小さい側が高い。斜路の折返しは踊り場を高さのちょうど半分に置く。

中間踊り場は残余として決まる

走り長・踏面・踊り場は一つの式で結ばれていて、書けるのは高々二つである。設計者が握りたいのは踏面の快適さなので、既定では残余を踊り場へ寄せる

landing: が書かれている : max(LANDING_MIN, 書かれた値)
斜路                    : max(LANDING_MIN, min(幅 ÷ 2, (全長 − entry) ÷ 3))
階段                    : max(LANDING_MIN, min((全長 − entry) − 段数分の目標踏面,
                                               (全長 − entry) − LANDING_MIN))

階段の「段数分」は max(1, max(k − 1, 段数 − k − 1)) 段、目標踏面は tread:、無ければ TREAD_TARGET(300mm)である。landing: を書けば踏面のほうが残余になる。導出値も書かれた値も、LANDING_MIN(1100mm)を下回れば最小奥行まで引き上げられる。

実際に解く

/B2/st は 2600 × 5400 の矩形、stair:N なので長さ 5400・幅 2600、階高 3700。

entry  = 1100                          (既定)
段数    = max(2, ⌈3700 ÷ 180⌉) = 21
蹴上げ  = 3700 ÷ 21 = 176.19mm         → "21 risers of 176mm"
k      = min(20, round(21 ÷ 2)) = 11
踏面段数 = max(1, max(11−1, 21−11−1)) = 10
踊り場   = max(1100, min(4300 − 10×300, 4300 − 1100)) = 1300
走り長   = 5400 − 1100 − 1300 = 3000
一本目の踏面 = 3000 ÷ (11 − 1) = 300mm
二本目の踏面 = 3000 ÷ (10 − 1) = 333.3mm

集約の踏面は最も窮屈な走りなので 300mm、走り長の合計は 3000 × 2 = 6000mm。CLI の一行がそのまま出る。

並列 — エスカレーター

一台の呼び幅は lane:、無ければ LANE_ESCALATOR(1200mm)。

台数   = max(1, ⌊幅 ÷ 呼び幅⌋)
一台の幅 = min(呼び幅, 幅 ÷ 台数)
余り    = (幅 − 一台の幅 × 台数) ÷ 2  を両端に等分

台ごとに走る向きが交互になる — 上りの隣は上から降りてくる一台である。lane: は階段・斜路・昇降機では効かない(台数は常に一である)。

examples/complex//L1/es は幅 3200 なので、

台数 1 本目 : t 1100…10900, s 400…1600,  上り
台数 2 本目 : t 1100…10900, s 1600…2800, 下り (幾何は同じ、進む向きだけが逆)

⌊3200 ÷ 1200⌋ = 2 台、一台 1200mm、余り 800 を 400 ずつ両端へ。

集約値

何を数えるか
going(走りの水平長の合計)一台目だけを数える。折返しの二本はどちらも数える
tread最も窮屈な走りが代表する
slope最も急な走りが代表する

この非対称は判定の前提である — 折返しの二本目は段数が多い分だけ細かいので、一本目だけを見ると窮屈な走りが stair.proportion をすり抜ける。

立体

部品
踊り場版。上端が踊り場の高さ、厚さは SLAB_T(200mm)
階段の走り蹴上げ k 段に対して段板は k − 1 枚(最上段は上階の床が受ける)。i 段目の上端は 下端 + i × 蹴上げ、厚みは 蹴上げ + TREAD_SOLID(200mm)
斜路・エスカレーター傾いた版一枚、厚さ SLAB_T
エスカレーターの欄干一台に二枚。幅 min(140, 台の幅 ÷ 8)・厚さ 100mm、段板面から 900mm 持ち上げた傾いた薄板
昇降機のかご四方から min(300, 辺 ÷ 6) だけ内へ寄せた箱。階高に依らず一定で、FL + 60 から FL + 2400 に立つ

傾きは z の大小が決める — 人の進む向きでは決めない。下りのエスカレーターは幾何としては上りと同じ向きに傾いており、違うのは進む向きだけである。この一語を幾何の意味でも読んだために、下りの台が鏡像に傾き、矢印が上向きに描かれ、二台目が平面から消えていた。

隣り合う頁