Advertisement
Guest User

Untitled

a guest
Apr 5th, 2020
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.13 KB | None | 0 0
  1. from math import sqrt
  2.  
  3. # n = int(input())
  4. # point_array = []
  5. # for i in range(0, n):
  6. #     point = input()
  7. #     point = point.split(" ")
  8. #     point = list(map(int, point))
  9. #     point_array.append(point)
  10. points_array = [[1, 1], [1, 2]]
  11. print(points_array)
  12. def perimeter(points):
  13.         perimeter = 0
  14.         for i in range(len(points)):
  15.             start = points[i - 1]
  16.             end = points[i]
  17.             side = sqrt((end[0] - start[0])**2 + (end[1] - start[1])**2)
  18.             perimeter += side
  19.         return perimeter
  20.        
  21. def rotate(A,B,C):
  22.   return (B[0]-A[0])*(C[1]-B[1])-(B[1]-A[1])*(C[0]-B[0])
  23.  
  24. def jarvismarch(A):
  25.   n = len(A)
  26.   P = [x for x in range(n)]
  27.   # start point
  28.   for i in range(1,n):
  29.     if A[P[i]][0]<A[P[0]][0]:
  30.       P[i], P[0] = P[0], P[i]  
  31.   H = [P[0]]
  32.   del P[0]
  33.   P.append(H[0])
  34.   while True:
  35.     right = 0
  36.     for i in range(1,len(P)):
  37.       if rotate(A[H[-1]],A[P[right]],A[P[i]])<0:
  38.         right = i
  39.     if P[right]==H[0]:
  40.       break
  41.     else:
  42.       H.append(P[right])
  43.       del P[right]
  44.   return H
  45. polygon = []
  46. needed = jarvismarch(points_array)
  47. # Берем минимальное выпуклое множество и строим из него такое, которое подойдет к условию
  48. for el in needed:
  49.     polygon.append(points_array[el])
  50. print(polygon)
  51. print(perimeter(polygon))
  52. for i in range(len(polygon)):
  53.     point = polygon[i]
  54.     temp = polygon
  55.     temp.append([point[0], point[1] + 1])
  56.     if len(jarvismarch(temp)) == len(needed):
  57.         polygon[i] = [point[0], point[1]+1]
  58.         continue
  59.     temp = polygon
  60.     temp.append([point[0], point[1] - 1])
  61.     if len(jarvismarch(temp)) == len(needed):
  62.         polygon[i] = [point[0], point[1]-1]
  63.         continue
  64.     temp = polygon
  65.     temp.append([point[0] + 1, point[1]])
  66.     if len(jarvismarch(temp)) == len(needed):
  67.         polygon[i] = [point[0] + 1, point[1]]
  68.         continue
  69.     temp = polygon
  70.     temp.append([point[0] - 1, point[1]])
  71.     if len(jarvismarch(temp)) == len(needed):
  72.         polygon[i] = [point[0] - 1, point[1]]
  73.         continue
  74. print(perimeter(polygon) / 2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement