Python исчисление площади полигонов с учетом вершин - PullRequest
2 голосов
/ 03 августа 2020

Я пытаюсь вычислить площадь конкретного многоугольника.

Позвольте мне объяснить лучше. Я пытаюсь узнать, как работать с полигонами в Python. Я знаю, что есть доступные пакеты, такие как Shapely , но я хотел бы написать код сам, используя более распространенные пакеты, такие как numpy, scipy или math .

Сейчас я пробую это упражнение: Учитывая некоторые координаты вершин и одну меру радиуса, рассчитайте площадь полученного многоугольника. Площадь формируется следующим образом: (площадь круга с центром в одной заданной точке и заданным радиусом) - (площадь многоугольника, образованного заданными вершинами по часовой стрелке) .

Давайте посмотрим на несколько примеров:

  1. У меня есть круг, и данные вершины образуют многоугольник, который не пересекает круг. Требуемая область - это просто площадь круга: area = areaCircle (простая задача - выполнено).

  2. У меня есть круг, и данные вершины образуют многоугольник который в какой-то момент действительно пересекает круг. Радиус как у палки (жесткий, размер не меняется со временем). Я должен вычислить area = areaCircle - areaPolygon (средняя задача).

  3. У меня есть круг, и данные вершины образуют многоугольник, который в какой-то момент пересекает круг . Радиус как у веревки (гибкий). Когда два многоугольника пересекаются, радиус меняется (поэтому круг не будет идеальным). Вот фото, чтобы лучше понять, что происходит. Как вы можете видеть, центр окружности равен (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 ) для расчета одной из двух других точек? У меня нет учителя, я учусь сам, и онлайн-подсказки мне не очень помогли.

Спасибо советом тем, кто поможет, и счастливого программирования всем :)

...