You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过角度阈值在NumPy插值中保留图形尖锐棱角?

保留插值图形尖锐棱角的解决方案

原方法基于弧长的线性插值会平滑掉尖锐拐点,核心问题是没识别并优先保留这些方向突变的关键点。我们可以通过计算相邻线段夹角筛选尖锐拐点,并在插值时强制将这些拐点纳入采样点集,从而保留棱角。

具体实现步骤

  1. 计算每个点的前后线段方向向量
  2. 计算相邻线段的夹角,筛选出超过阈值的尖锐拐点
  3. 生成包含尖锐拐点弧长的采样点集
  4. 基于新的采样点集执行插值

完整代码

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, label='原始点')

# ---------------------- 新增:计算尖锐拐点 ----------------------
# 计算相邻点的方向向量(闭合曲线,首尾相连)
dx = np.diff(x, append=x[0])
dy = np.diff(y, append=y[0])
# 单位化方向向量
n = np.sqrt(dx**2 + dy**2)
dx_norm = dx / n
dy_norm = dy / n

# 计算每个点的前后方向向量的点积(用于求夹角)
dot_products = dx_norm[:-1] * dx_norm[1:] + dy_norm[:-1] * dy_norm[1:]
# 转换为角度(弧度转角度),避免数值误差导致的nan
angles = np.degrees(np.arccos(np.clip(dot_products, -1, 1)))
# 角度阈值:小于该值的视为尖锐棱角(可按需调整)
angle_threshold = 30
# 筛选尖锐拐点的索引
sharp_indices = np.where(angles < angle_threshold)[0]
# 补充最后一个点,确保闭合曲线首尾衔接
sharp_indices = np.append(sharp_indices, len(x)-1)

# ---------------------- 原逻辑:计算弧长 ----------------------
dx_seg, dy_seg = x[1:]-x[:-1], y[1:]-y[:-1]
ds_seg = np.sqrt(dx_seg**2 + dy_seg**2)
s = np.cumsum(np.append(0, ds_seg))

# ---------------------- 生成包含尖锐点的采样弧长 ----------------------
# 原均匀采样点
num_uniform_points = 30
uniform_s = np.linspace(0, s[-1], num_uniform_points)
# 尖锐点对应的弧长
sharp_s = s[sharp_indices]
# 合并、去重并排序,确保采样点有序
combined_s = np.unique(np.concatenate([uniform_s, sharp_s]))

# ---------------------- 执行插值 ----------------------
xinter = np.interp(combined_s, s, x)
yinter = np.interp(combined_s, s, y)

# 绘图
ax.plot(xinter, yinter, label='插值曲线')
ax.scatter(xinter, yinter, s=5, zorder=4, label='插值点')
ax.legend()
plt.show()

关键部分解释

  • 方向向量与夹角计算:通过相邻线段的单位向量点积计算夹角,点积越接近-1,夹角越接近180度;越接近1,夹角越接近0度。筛选夹角小于阈值的点,这些就是需要保留的尖锐拐点。
  • 采样点集合并:把原均匀采样的弧长点和尖锐拐点的弧长点合并,去重排序后,插值时会强制经过这些拐点,避免棱角被平滑。
  • 阈值调整:angle_threshold可按需调整,值越小,只有越尖锐的角才会被保留;值越大,更多接近直角的角也会被保留。

内容的提问来源于stack exchange,提问作者Dr. Pontchartrain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:05:15