laba2.py 2.9 KB

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