我正在使用gboffi中gboffi的优秀代码(包含在下面),用numpy的linspace
和interp
插入一个形状。
这样做效果很好,但是有时会漏掉角,从而导致不希望的软化形状。
我想用一个Angular 阈值参数来保持形状的尖角。如果下一个线段的Angular 足够尖锐,有没有办法保持形状插值的尖角?谢谢!
from matplotlib import pyplot as plt
import numpy as np
x = np.array([815.9, 693.2, 570.4, 462.4, 354.4, 469.9, 585.4, 700.6, 815.9])
y = np.array([529.9, 637.9, 746, 623.2, 500.5, 326.9, 153.3, 341.6, 529.9])
fig, ax = plt.subplots(1)
ax.set_aspect('equal')
ax.scatter(x, y, s=40, zorder=3, alpha=0.3)
# compute the distances, ds, between points
dx, dy = x[+1:]-x[:-1], y[+1:]-y[:-1]
ds = np.array((0, *np.sqrt(dx*dx+dy*dy)))
# compute the total distance from the 1st point, measured on the curve
s = np.cumsum(ds)
# interpolate
xinter = np.interp(np.linspace(0,s[-1], 30), s, x)
yinter = np.interp(np.linspace(0,s[-1], 30), s, y)
# plot the interpolated points
ax.plot(xinter, yinter)
ax.scatter(xinter, yinter, s=5, zorder=4)
plt.show()
4条答案
按热度按时间wswtfjt71#
∮找到尖锐的Angular ∮
为了找到Angular 大于某个截止值的所有点,可以计算归一化差向量的点积的反余弦。
另一个公式是叉积和点积的atan2,它避免了除法。
回答原始问题
一个简单的扩展是将
s
的点插入到用于中间点(np.linspace(0,s[-1], 30)
)的数组中。mlmc2os52#
你应该先确定角;计算曲线每段之间的Angular ,如果Angular 大于某个阈值,则可以将该点视为角点。然后,可以在角点处分割曲线,计算点之间的距离,并单独对每段进行插值。
我就是这么做的。
whhtz7ly3#
假设您有一个“corner”列表,例如:
(note
corners
包括第一点和最后一点的索引,即,在该示例中x
的长度应该是49)。接下来计算
s
,然后计算角位置列表你最终可以计算出你想要计算插值的点的列表
几句话
这意味着:列表
arrays
中的数组是“开区间”[c0, c0+Δ,..., c1)
,除了最后一个,因为我们想要画一条闭合曲线。这是回答你问题的容易部分,难的是找到角落...
mf98qq944#
如果xinter和yinter步长不是边长的分割线,就不可能制作尖角。在这种情况下,你需要步长25,因为你的边长是100。
试试这个: