Я пытаюсь вычислить площадь конкретного многоугольника.
Позвольте мне объяснить лучше. Я пытаюсь узнать, как работать с полигонами в Python. Я знаю, что есть доступные пакеты, такие как Shapely , но я хотел бы написать код сам, используя более распространенные пакеты, такие как numpy, scipy или math .
Сейчас я пробую это упражнение: Учитывая некоторые координаты вершин и одну меру радиуса, рассчитайте площадь полученного многоугольника. Площадь формируется следующим образом: (площадь круга с центром в одной заданной точке и заданным радиусом) - (площадь многоугольника, образованного заданными вершинами по часовой стрелке) .
Давайте посмотрим на несколько примеров:
У меня есть круг, и данные вершины образуют многоугольник, который не пересекает круг. Требуемая область - это просто площадь круга: area = areaCircle (простая задача - выполнено).
У меня есть круг, и данные вершины образуют многоугольник который в какой-то момент действительно пересекает круг. Радиус как у палки (жесткий, размер не меняется со временем). Я должен вычислить area = areaCircle - areaPolygon (средняя задача).
У меня есть круг, и данные вершины образуют многоугольник, который в какой-то момент пересекает круг . Радиус как у веревки (гибкий). Когда два многоугольника пересекаются, радиус меняется (поэтому круг не будет идеальным). Вот фото, чтобы лучше понять, что происходит. Как вы можете видеть, центр окружности равен (5,5), а его радиус составляет ~ 4. Когда радиус-веревка попадает в многоугольник в (4, 7) и (8, 4), он деформирует круг. Итак, область, которую я пытаюсь получить, должна быть: area = areaDeformedCircle - areaPolygon (сложная задача).
Вот пока мой код:
from math import pi
# parser for input
def parser():
while 1:
data = list(input().split(' '))
for number in data:
if len(number) > 0:
yield (number)
input_parser = parser()
def get_word():
global input_parser
return next(input_parser)
def get_number():
data = get_word()
try:
return int(data)
except ValueError:
return float(data)
# input data:
X,Y,L = map(int,input().split()) # circle data: X_coord_center, Y_coord_center, radius
N = get_number() # number of vertices of the polygon
vertexes = []
for i in range(N): #vertices of the polygon, given clockwise
xy = (get_number(), get_number())
vertexes.append(xy)
def circleArea(radius):
return pi * radius ** 2
# from question https://stackoverflow.com/questions/24467972/calculate-area-of-polygon-given-x-y-coordinates
def polyArea(coords):
t=0
for count in range(len(coords)-1):
y = coords[count+1][1] + coords[count][1]
x = coords[count+1][0] - coords[count][0]
z = y * x
t += z
return abs(t/2.0)
# area polygon
print("area polygon: ", polyArea(vertexes))
# area circle
print("area circle: ", circleArea(L))
Дело в том, что я могу выполнить только точку 1) между ними (вычислить радиус круга, ничего страшного). фактически, учитывая эти примеры ввода, я могу вычислить правильную площадь только тогда, когда многоугольник не пересекает круг.
example where the circle does not intersect the polygon (answerArea = 3.14159)
3 3 1
4
3 5
6 7
8 5
7 2
example where the circle intersects the polygon (answerArea = 36.71737) - it's the image's data
5 5 4
4
4 7
7 9
9 7
8 4
Как мне изменить свой код ( НЕ с использованием Shapely ) для расчета одной из двух других точек? У меня нет учителя, я учусь сам, и онлайн-подсказки мне не очень помогли.
Спасибо советом тем, кто поможет, и счастливого программирования всем :)