Advertisement
kxcoze

ruslan_makoha_lab??

May 12th, 2021
764
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.95 KB | None | 0 0
  1. from itertools import combinations
  2. from math import sqrt, inf
  3.  
  4.  
  5. def create_line(x1, y1, x2, y2):
  6.     """
  7.    y = (k)x + (b)
  8.    """
  9.     try:
  10.         k = round((y2 - y1)/(x2 - x1), 3)
  11.         b = round((x2*y1 - x1*y2)/(x2 - x1), 3)
  12.     except ZeroDivisionError:
  13.         print("Деление на ноль.")
  14.     else:
  15.         return (k, b), (x1, y1, x2, y2)
  16.  
  17.  
  18. def check_three_dots(x1, y1, x2, y2, x3, y3):
  19.     pair1, _ = create_line(x1, y1, x2, y2)
  20.     pair2, _ = create_line(x2, y2, x3, y3)
  21.     if pair1[0] == pair2[0] and pair1[1] == pair2[1]:
  22.         return False
  23.     return True
  24.  
  25.  
  26. def calculate_circle(x1, y1, x2, y2, x3, y3):
  27.     ma = (y2 - y1)/(x2 - x1)
  28.     mb = (y3 - y2)/(x3 - x2)
  29.     x = round((ma*mb*(y1-y3) + mb*(x1 + x2) - ma*(x2 + x3))/(2*(mb - ma)), 3)
  30.     if ma != 0:
  31.         y = round((-(x-((x1 + x2)/2))/ma) + (y1+y2)/2, 3)
  32.     else:
  33.         y = round((-(x-((x2 + x3)/2))/mb) + (y2+y3)/2, 3)
  34.     r = round(sqrt((x - x1)**2 + (y - y1)**2), 3)
  35.     return x, y, r, (x1, y1, x2, y2, x3, y3)
  36.  
  37.  
  38. n = int(input("Введите кол-во точек: "))
  39. coordinates = []
  40. print(f"Введите {n} точек, задав координату в виде (x, y) - x, y (через пробел):")
  41. for _ in range(n):
  42.     x, y = map(int, input().split())
  43.     coordinates.append((x, y))
  44.  
  45. comb_dots = list(combinations(coordinates, 3))
  46. min_radius = inf
  47. for comb in comb_dots:
  48.     coord = *comb[0], *comb[1], *comb[2]
  49.     if check_three_dots(*coord):
  50.         result = calculate_circle(*coord)
  51.         if min_radius > result[2]:
  52.             min_radius = result[2]
  53.             answer = 'Координаты центра окружности: ' + str(result[:2]) + ' Точки: ' + str(result[3])
  54.     else:
  55.         print("Данные точки лежат на одной прямой.", coord)
  56.  
  57. if min_radius != inf:
  58.     print("Радиус окружности: ", min_radius)
  59.     print(answer)
  60. else:
  61.     print("Ответа нет.")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement