| t | def info(dots, dot): | t | def info(dots, dot): |
| points = list(dots) | | points = list(dots) |
| n = len(points) | | n = len(points) |
| perimeter = 0.0 | | perimeter = 0.0 |
| for i in range(n): | | for i in range(n): |
| x1, y1 = points[i] | | x1, y1 = points[i] |
| x2, y2 = points[(i + 1) % n] | | x2, y2 = points[(i + 1) % n] |
| dx = x2 - x1 | | dx = x2 - x1 |
| dy = y2 - y1 | | dy = y2 - y1 |
| perimeter += (dx ** 2 + dy ** 2) ** 0.5 | | perimeter += (dx ** 2 + dy ** 2) ** 0.5 |
| convex = True | | convex = True |
| if n < 3: | | if n < 3: |
| convex = False | | convex = False |
| else: | | else: |
| signs = [] | | signs = [] |
| for i in range(n): | | for i in range(n): |
| x1, y1 = points[i] | | x1, y1 = points[i] |
| x2, y2 = points[(i + 1) % n] | | x2, y2 = points[(i + 1) % n] |
| x3, y3 = points[(i + 2) % n] | | x3, y3 = points[(i + 2) % n] |
| cross = (x2 - x1) * (y3 - y2) - (y2 - y1) * (x3 - x2) | | cross = (x2 - x1) * (y3 - y2) - (y2 - y1) * (x3 - x2) |
| if cross != 0: | | if cross != 0: |
| signs.append(1 if cross > 0 else -1) | | signs.append(1 if cross > 0 else -1) |
| if signs: | | if signs: |
| first_sign = signs[0] | | first_sign = signs[0] |
| for s in signs: | | for s in signs: |
| if s != first_sign: | | if s != first_sign: |
| convex = False | | convex = False |
| break | | break |
| else: | | else: |
| convex = False | | convex = False |
| x, y = dot | | x, y = dot |
| inside = False | | inside = False |
| for i in range(n): | | for i in range(n): |
| x1, y1 = points[i] | | x1, y1 = points[i] |
| x2, y2 = points[(i + 1) % n] | | x2, y2 = points[(i + 1) % n] |
| if (y1 > y) != (y2 > y): | | if (y1 > y) != (y2 > y): |
| x_intersect = x1 + (x2 - x1) * (y - y1) / (y2 - y1) | | x_intersect = x1 + (x2 - x1) * (y - y1) / (y2 - y1) |
| if x_intersect > x: | | if x_intersect > x: |
| inside = not inside | | inside = not inside |
| return (perimeter, convex, inside) | | return (perimeter, convex, inside) |