Алмаз Сейтхазин (КФ МГУ, кафедра НДС) PolyDot 5206
david_Yakhin_312 PolyDot 5179
t1def info(dots, dot):t1def info(dots, dot):
2    points = list(dots)2    points = list(dots)
3    n = len(points)3    n = len(points)
4    perimeter = 0.04    perimeter = 0.0
5    for i in range(n):5    for i in range(n):
6        x1, y1 = points[i]6        x1, y1 = points[i]
7        x2, y2 = points[(i + 1) % n]7        x2, y2 = points[(i + 1) % n]
8        dx = x2 - x18        dx = x2 - x1
9        dy = y2 - y19        dy = y2 - y1
10        perimeter += (dx ** 2 + dy ** 2) ** 0.510        perimeter += (dx ** 2 + dy ** 2) ** 0.5
11    convex = True11    convex = True
12    if n < 3:12    if n < 3:
13        convex = False13        convex = False
14    else:14    else:
15        signs = []15        signs = []
16        for i in range(n):16        for i in range(n):
17            x1, y1 = points[i]17            x1, y1 = points[i]
18            x2, y2 = points[(i + 1) % n]18            x2, y2 = points[(i + 1) % n]
19            x3, y3 = points[(i + 2) % n]19            x3, y3 = points[(i + 2) % n]
20            cross = (x2 - x1) * (y3 - y2) - (y2 - y1) * (x3 - x2)20            cross = (x2 - x1) * (y3 - y2) - (y2 - y1) * (x3 - x2)
21            if cross != 0:21            if cross != 0:
22                signs.append(1 if cross > 0 else -1)22                signs.append(1 if cross > 0 else -1)
23        if signs:23        if signs:
24            first_sign = signs[0]24            first_sign = signs[0]
25            for s in signs:25            for s in signs:
26                if s != first_sign:26                if s != first_sign:
27                    convex = False27                    convex = False
28                    break28                    break
29        else:29        else:
30            convex = False30            convex = False
31    x, y = dot31    x, y = dot
32    inside = False32    inside = False
33    for i in range(n):33    for i in range(n):
34        x1, y1 = points[i]34        x1, y1 = points[i]
35        x2, y2 = points[(i + 1) % n]35        x2, y2 = points[(i + 1) % n]
36        if (y1 > y) != (y2 > y):36        if (y1 > y) != (y2 > y):
37            x_intersect = x1 + (x2 - x1) * (y - y1) / (y2 - y1)37            x_intersect = x1 + (x2 - x1) * (y - y1) / (y2 - y1)
38            if x_intersect > x:38            if x_intersect > x:
39                inside = not inside39                inside = not inside
40    return (perimeter, convex, inside)40    return (perimeter, convex, inside)
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op