kxcoze

satie_lab8_8

Nov 15th, 2022
851
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.48 KB | None | 0 0
  1. import numpy as np
  2.  
  3.  
  4. def cast_line(h, r1, r2):
  5.     # Кастим прямую с углом наклона tan(h), которая
  6.     # исходит из точки (r1, r2)
  7.     k = np.round(np.tan(h), K)
  8.     return k, -k*r1+r2
  9.  
  10.  
  11. def intersection(y1, y2):
  12.     k1, b1 = y1
  13.     k2, b2 = y2
  14.     if k1 == k2: return None
  15.  
  16.     x = np.round((b2-b1) / (k1-k2), K)
  17.     y = np.round(k1*x + b1, K)
  18.     return x, y
  19.  
  20.  
  21. def dist(x1, y1, x2, y2):
  22.     return np.round(np.sqrt((x1-x2)**2 + (y1-y2)**2), K)
  23.  
  24.  
  25. def get_all_intersections(all_lines, cur_line):
  26.     intrs = []
  27.     for line in all_lines:
  28.         p = intersection(line, cur_line)
  29.         if p: intrs.append((p, line))
  30.     return intrs
  31.  
  32.  
  33. def get_first_near_intersections(lines, cur_line, initial_point):
  34.     x0, y0 = initial_point
  35.     intrs = get_all_intersections(lines, cur_line)
  36.     forward = []
  37.     backward = []
  38.     for p, line in intrs:
  39.         x1, y1 = p
  40.         if (x0 == x1 and y0 <= y1) or (x0 <= x1 and y0 == y1) or x0 <= x1:
  41.             forward.append([dist(x0, y0, x1, y1), line, p])
  42.         else:
  43.             backward.append([dist(x0, y0, x1, y1), line, p])
  44.     if not backward or not forward:
  45.         print(f'({x}, {y}) не находится в каком-либо многоугольнике!')
  46.         raise SystemExit(1)
  47.     return min(forward), min(backward)
  48.  
  49.  
  50. n = int(input('Введите кол-во прямых: '))
  51. print('Введите k, b для уравнения прямой вида y = kx + b')
  52. lines = []
  53. for i in range(1, n+1):
  54.     k, b = map(float, input(f'Прямая {i}: ').split())
  55.     lines.append((k, b))
  56.  
  57. x, y = map(float, input('Введите координаты точки A(x, y): ').split())
  58. K = 16
  59. h = 0.01
  60. vertexes = set()
  61. for i in np.arange(-np.pi/2+h, np.pi/2-h, h):
  62.     cur_line = cast_line(i, x, y)
  63.     forward_result, backward_result = get_first_near_intersections(lines, cur_line, (x, y))
  64.     for result in (forward_result, backward_result):
  65.         _, line, intr = result
  66.         forward_result2, backward_result2 = get_first_near_intersections(lines, line, intr)
  67.         for second_result in (forward_result2, backward_result2):
  68.             _, _, vertex = second_result
  69.             _x, _y = vertex
  70.             _x = np.round(_x, K//2)
  71.             _y = np.round(_y, K//2)
  72.             vertexes.add((_x, _y))
  73.  
  74. print(f'Вершины многоугольника, которому принадлежит начальная точка A({x}, {y})')
  75. print(vertexes)
  76.  
  77.  
Advertisement
Add Comment
Please, Sign In to add comment