Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- def cast_line(h, r1, r2):
- # Кастим прямую с углом наклона tan(h), которая
- # исходит из точки (r1, r2)
- k = np.round(np.tan(h), K)
- return k, -k*r1+r2
- def intersection(y1, y2):
- k1, b1 = y1
- k2, b2 = y2
- if k1 == k2: return None
- x = np.round((b2-b1) / (k1-k2), K)
- y = np.round(k1*x + b1, K)
- return x, y
- def dist(x1, y1, x2, y2):
- return np.round(np.sqrt((x1-x2)**2 + (y1-y2)**2), K)
- def get_all_intersections(all_lines, cur_line):
- intrs = []
- for line in all_lines:
- p = intersection(line, cur_line)
- if p: intrs.append((p, line))
- return intrs
- def get_first_near_intersections(lines, cur_line, initial_point):
- x0, y0 = initial_point
- intrs = get_all_intersections(lines, cur_line)
- forward = []
- backward = []
- for p, line in intrs:
- x1, y1 = p
- if (x0 == x1 and y0 <= y1) or (x0 <= x1 and y0 == y1) or x0 <= x1:
- forward.append([dist(x0, y0, x1, y1), line, p])
- else:
- backward.append([dist(x0, y0, x1, y1), line, p])
- if not backward or not forward:
- print(f'({x}, {y}) не находится в каком-либо многоугольнике!')
- raise SystemExit(1)
- return min(forward), min(backward)
- n = int(input('Введите кол-во прямых: '))
- print('Введите k, b для уравнения прямой вида y = kx + b')
- lines = []
- for i in range(1, n+1):
- k, b = map(float, input(f'Прямая {i}: ').split())
- lines.append((k, b))
- x, y = map(float, input('Введите координаты точки A(x, y): ').split())
- K = 16
- h = 0.01
- vertexes = set()
- for i in np.arange(-np.pi/2+h, np.pi/2-h, h):
- cur_line = cast_line(i, x, y)
- forward_result, backward_result = get_first_near_intersections(lines, cur_line, (x, y))
- for result in (forward_result, backward_result):
- _, line, intr = result
- forward_result2, backward_result2 = get_first_near_intersections(lines, line, intr)
- for second_result in (forward_result2, backward_result2):
- _, _, vertex = second_result
- _x, _y = vertex
- _x = np.round(_x, K//2)
- _y = np.round(_y, K//2)
- vertexes.add((_x, _y))
- print(f'Вершины многоугольника, которому принадлежит начальная точка A({x}, {y})')
- print(vertexes)
Advertisement
Add Comment
Please, Sign In to add comment