Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from math import sqrt
- # n = int(input())
- # point_array = []
- # for i in range(0, n):
- # point = input()
- # point = point.split(" ")
- # point = list(map(int, point))
- # point_array.append(point)
- points_array = [[1, 1], [1, 2]]
- print(points_array)
- def perimeter(points):
- perimeter = 0
- for i in range(len(points)):
- start = points[i - 1]
- end = points[i]
- side = sqrt((end[0] - start[0])**2 + (end[1] - start[1])**2)
- perimeter += side
- return perimeter
- def rotate(A,B,C):
- return (B[0]-A[0])*(C[1]-B[1])-(B[1]-A[1])*(C[0]-B[0])
- def jarvismarch(A):
- n = len(A)
- P = [x for x in range(n)]
- # start point
- for i in range(1,n):
- if A[P[i]][0]<A[P[0]][0]:
- P[i], P[0] = P[0], P[i]
- H = [P[0]]
- del P[0]
- P.append(H[0])
- while True:
- right = 0
- for i in range(1,len(P)):
- if rotate(A[H[-1]],A[P[right]],A[P[i]])<0:
- right = i
- if P[right]==H[0]:
- break
- else:
- H.append(P[right])
- del P[right]
- return H
- polygon = []
- needed = jarvismarch(points_array)
- # Берем минимальное выпуклое множество и строим из него такое, которое подойдет к условию
- for el in needed:
- polygon.append(points_array[el])
- print(polygon)
- print(perimeter(polygon))
- for i in range(len(polygon)):
- point = polygon[i]
- temp = polygon
- temp.append([point[0], point[1] + 1])
- if len(jarvismarch(temp)) == len(needed):
- polygon[i] = [point[0], point[1]+1]
- continue
- temp = polygon
- temp.append([point[0], point[1] - 1])
- if len(jarvismarch(temp)) == len(needed):
- polygon[i] = [point[0], point[1]-1]
- continue
- temp = polygon
- temp.append([point[0] + 1, point[1]])
- if len(jarvismarch(temp)) == len(needed):
- polygon[i] = [point[0] + 1, point[1]]
- continue
- temp = polygon
- temp.append([point[0] - 1, point[1]])
- if len(jarvismarch(temp)) == len(needed):
- polygon[i] = [point[0] - 1, point[1]]
- continue
- print(perimeter(polygon) / 2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement