| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- # -*- coding: utf-8 -*-
- """
- Лаба 2. Проектирование трассы: шаг трассирования по плану в горизонталях.
- l_тр = dh / i_max (км, в натуре); l_план = l_тр * 1e5 / M (см, в плане),
- где M — знаменатель масштаба плана.
- Проверка по примеру методички: категория II, горная местность,
- i_max = 70 промиллей, dh = 10 м, M = 10000 -> 0,143 км и 1,43 см.
- """
- from math import floor
- def rup(x, n=3):
- p = 10 ** n
- return floor(x * p + 0.5) / p
- # Наибольшие продольные уклоны, промиллей (табл. 1): (основной, пересеченная, горная)
- IMAX = {
- "I": (30, 40, 60),
- "II": (40, 50, 70),
- "III": (50, 60, 80),
- "IV": (60, 70, 90),
- }
- # Варианты (табл. 4 методички): местность, категория
- VARIANTS = {
- 1: ("горная", "I"), 2: ("пересеченная", "II"), 3: ("горная", "III"),
- 4: ("пересеченная", "IV"), 5: ("пересеченная", "I"), 6: ("горная", "IV"),
- 7: ("горная", "II"), 8: ("пересеченная", "IV"), 9: ("горная", "III"),
- 10: ("горная", "I"), 11: ("пересеченная", "IV"), 12: ("пересеченная", "II"),
- 13: ("пересеченная", "III"), 14: ("горная", "I"), 15: ("горная", "IV"),
- 16: ("пересеченная", "I"), 17: ("пересеченная", "II"), 18: ("горная", "III"),
- 19: ("пересеченная", "II"), 20: ("горная", "I"),
- }
- def compute(terrain, category, dh=10, M=10000):
- """Шаг трассирования. terrain: 'горная'|'пересеченная'."""
- idx = {"основной": 0, "пересеченная": 1, "горная": 2}[terrain]
- i_max = IMAX[category][idx]
- l_nature_km = rup(dh / i_max, 3) # км в натуре
- l_nature_m = rup(dh / i_max * 1000, 0) # м в натуре
- l_plan_sm = rup(dh / i_max * 1e5 / M, 2) # см в плане
- return {
- "i_max, промиллей": i_max, "dh, м": dh, "масштаб": f"1:{M}",
- "l_тр, км (натура)": l_nature_km, "l_тр, м (натура)": l_nature_m,
- "l_тр, см (план)": l_plan_sm,
- }
- def report(title, res):
- print(f"\n=== {title} ===")
- for k, v in res.items():
- print(f" {k:20} = {v}")
- if __name__ == "__main__":
- import sys
- if len(sys.argv) > 1 and sys.argv[1].isdigit():
- n = int(sys.argv[1])
- terrain, cat = VARIANTS[n]
- report(f"Вариант {n}: {terrain} местность, категория {cat}",
- compute(terrain, cat))
- else:
- # пример методички
- report("Пример методички: горная, II категория", compute("горная", "II"))
|