我正在使用贝塞尔曲线包(https://github.com/dhermes/bezier)从贝塞尔曲线创建CurvedPolygon。现在,我想将我的CurvedPolygon与另一个多边形相交,但到目前为止还不知道如何进行相交。
也许还有另一种方式,所以我也陈述了我的最终目标。这是要计算(仅部分)CurvedPolygon的面积。类似于下图中0.4标记的左侧区域(= 0.08):
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))
似乎目前无法使用dhermes / bezier包将两个CurvedPolygon相交。
但是在我的用例中,可以遍历CurvedPolygon的节点,并使用specialize函数切出不需要的片段: