как пересечь CurvedPolygon, чтобы вычислить пересекающуюся область - PullRequest
0 голосов
/ 25 февраля 2020

Я использую пакет Безье (https://github.com/dhermes/bezier) для создания CurvedPolygon из кривых Безье. Теперь я хочу пересечь свой CurvedPolygon с другим многоугольником, но пока не могу понять, как сделать это пересечение.

Может быть, есть другой способ, поэтому я также сформулирую свою конечную цель. Который должен рассчитать (только часть) площадь CurvedPolygon. Как область слева от отметки 0,4 на следующей диаграмме (= 0,08):

enter image description here

import bezier
import numpy as np


def line_to(frm, to) -> bezier.Curve:
    nodes = np.array([
        [frm[0], to[0]],
        [frm[1], to[1]]
    ])
    bezier_segment = bezier.Curve(nodes, 1)
    return bezier_segment


def main():
    segments = []
    segments.append(line_to((0, 0), (1, 1)))
    segments.append(line_to((1, 1), (1, 0)))
    segments.append(line_to((1, 0), (0, 0)))

    poly = bezier.CurvedPolygon(*segments)
    print(abs(poly.area))

    segments2 = []
    segments2.append(line_to((0.4, 0), (0.4, 1)))
    segments2.append(line_to((0.4, 1), (1, 1)))
    segments2.append(line_to((1, 1), (1, 0)))
    segments2.append(line_to((1, 0), (0.4, 0)))
    poly2 = bezier.CurvedPolygon(*segments2)

    res = poly.intersect(poly2)  # <= this does not work
    print(res.area)


if __name__ == '__main__':
    main()

Я действительно мог бы использовать некоторые идеи?

Я уже пытался отработать пересечение с линией 0,4, чтобы я мог пропустить сегменты CurvedPolygon, которые мне не нужны. Это не сработало из-за сложных пересечений кривых.

edges = list(edge._nodes for edge in curved_polygon._edges)
# skip unwanted segments
area = _triangle_helpers.compute_area(tuple(edges))

1 Ответ

0 голосов
/ 26 февраля 2020

Похоже, что в настоящее время нет способа пересечения двух экземпляров CurvedPolygon с использованием пакета dhermes / bezier .

Однако для моего варианта использования была возможность перебирать узлы CurvedPolygon и вырезать ненужные сегменты, используя функцию специализации:

curve.specialize (начало, конец)

...