縦動線の算術
段数も踏面も勾配も書かれない。領域と階高と「上る向き」の宣言だけから導かれる。
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:がstraight・return以外- 階段と斜路以外に
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 の大小が決める — 人の進む向きでは決めない。下りのエスカレーターは幾何としては上りと同じ向きに傾いており、違うのは進む向きだけである。この一語を幾何の意味でも読んだために、下りの台が鏡像に傾き、矢印が上向きに描かれ、二台目が平面から消えていた。