如何使用Shapely(或更好的库)创建具有弧线的多边形

7
我正在尝试使用Shapely来识别形状所使用的区域以及CNC路由器上将用于切割它的工具所使用的区域。该形状是使用ezdxf从dxf图纸导入的。
工具路径可以是矩形(如果它们被锯盘沿直线切割)或一组线段(如果它们是由铣刀路由的)。在两种情况下,我都可以使用LineString.buffer()自动创建偏移量并找到工具使用的区域。
我使用shapely是因为我认为它是最好的工具,可用于查找形状是否重叠(使用union()将所有工具合并为一个形状,并使用overlaps()查找干涉)。如果有更好的工具,请告知我。 buffer()在创建表示角上弧线段时做得很好。
有没有办法创建表示形状上弧线段的线段?
例如,如何在此形状的左侧创建弧线?我需要创建自己的(缓慢)Python函数吗?还是有优化的shapely方式?

Green is the part, yellow are the saw disk cuts, magenta are the milling bit cuts

2个回答

11

自己在Python中创建弧的方法并不一定很慢。Numpy非常适合这类操作,而Shapely则被有意设计为能够很好地与Numpy相互操作。

例如,

import numpy as np
import shapely.geometry as geom

# Define the arc (presumably ezdxf uses a similar convention)
centerx, centery = 3, 4
radius = 2
start_angle, end_angle = 30, 56 # In degrees
numsegments = 1000

# The coordinates of the arc
theta = np.radians(np.linspace(start_angle, end_angle, numsegments))
x = centerx + radius * np.cos(theta)
y = centery + radius * np.sin(theta)

arc = geom.LineString(np.column_stack([x, y]))

在我的计算机上,将弧线在起始角度和结束角度之间分成1000个点的近似值大约需要3毫秒(这包括将其转换为Shapely LineString的时间)。


如果我用Python循环的方式来做,速度会很慢。使用NumPy会快得多。(好吧,我还没有测试过,但这是我根据我对NumPy的了解所做出的假设)。谢谢! - stenci
我进行了一些测试,结果表明使用numpy数组和Python列表的速度大致相同。对于较小的数据集,列表比numpy数组快50%,而对于较大的数据集,numpy数组比列表快20%。 - stenci
1
@stenci - 只是提醒一下,这个20%/50%的差异会因为你的数据集大小以及你如何使用numpy而有很大的变化(例如,y = x * 5y = [i * 5 for i in x]要快得多,而且对于大型数据集来说,这个20%可能会变成20倍或2000倍)。Numpy数组是与列表非常不同的数据结构(非常节省内存,但大小固定:无法添加)。如果你只处理最多几百个项目的序列,那么numpy就显得太过浪费了。如果你正在处理数十亿个项目,那么numpy是唯一的选择。 - Joe Kington
当我看到你在示例中使用了1000个点时,我就想象是这样的。我的弧将有3到300个线段,并且仅使用numpy创建一个数组,然后将其馈送给“LineString”后就会丢失,这是过度的。我使用了你的示例来借用“linspace”(比我的旧循环更快),并开始探索numpy。 - stenci
如何在地理坐标系中使用此解决方案?我正在寻找Turf JS的扇区的Python等效代码。 - Martim Passos
@MartimPassos,您应该创建一个新的问题。如果您想要,可以在其中放置此问题的链接。没有人会在评论中回答您。 - stenci

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接