多边形平滑(Smoothing of a polygon)代码错误排查求助
多边形平滑代码问题排查与修复
问题根源
你的代码直接在原始的self.x和self.y数组上修改值,导致后续点的计算会用到已经被平滑过的坐标,而非最初的原始顶点数据。比如:
- 先修改了
self.x[0],之后计算self.x[-1]时用到的self.x[0]已经是平滑后的值,不是原始点 - 中间循环处理i=1时,用到的
self.x[0]也是修改后的结果,这会让平滑结果偏移,和预期的红色正确图形不一致
修复方案(基于相同平滑逻辑)
先把原始坐标复制一份,所有平滑计算都基于原始副本,最后再把计算结果赋值回原数组,避免计算过程中值被覆盖:
def smooth_polygon(self, alpha): n = len(self.x) # 保存原始坐标的副本,避免修改原数据影响后续计算 orig_x = self.x.copy() orig_y = self.y.copy() # 处理第一个点(环形连接,用到最后一个原始点) self.x[0] = (1 - alpha) * orig_x[0] + alpha * 0.5 * (orig_x[-1] + orig_x[1]) self.y[0] = (1 - alpha) * orig_y[0] + alpha * 0.5 * (orig_y[-1] + orig_y[1]) # 处理最后一个点(环形连接,用到第一个原始点) self.x[-1] = (1 - alpha) * orig_x[-1] + alpha * 0.5 * (orig_x[-2] + orig_x[0]) self.y[-1] = (1 - alpha) * orig_y[-1] + alpha * 0.5 * (orig_y[-2] + orig_y[0]) # 处理中间点 for i in range(1, n-1): self.x[i] = (1 - alpha) * orig_x[i] + 0.5 * alpha * (orig_x[i-1] + orig_x[i+1]) self.y[i] = (1 - alpha) * orig_y[i] + 0.5 * alpha * (orig_y[i-1] + orig_y[i+1]) plt.plot(self.x, self.y, 'k.-') plt.show() return self.x, self.y
说明
这个修改完全保留了你原本的平滑公式,只是通过使用原始坐标副本解决了值被覆盖的问题,确保每个点的计算都基于最初的多边形顶点,这样就能得到和预期一致的平滑效果。
内容的提问来源于stack exchange,提问作者Astyanax
相关产品推荐
相关产品推荐

