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

Python项目中保持线条形态的随机点重绘方案咨询

需求:随机重绘线条且保持形态的优化方案

我有一个Python项目,需要多次重绘线条,要求点的位置随机,但保持线条的形状和点数大致不变。最终输出将使用多边形点,而非Bezier路径(不过不反对将Bezier作为中间步骤)。

下图展示了点如何在线条上移动到不同位置同时保持整体形态:
点移动动画

我已有一个可行示例,通过在现有点之间选取随机新点来实现(下图中的红线),效果尚可,但希望了解其他更优实现方法?

尽管此代码使用matplotlib演示线条,但最终程序不会使用它。

import numpy as np
from matplotlib import pyplot as plt
import random
from random import (randint,uniform)

def move_along_line(p1, p2, scalar):
    distX = p2[0] - p1[0]
    distY = p2[1] - p1[1]

    modX = (distX * scalar) + p1[0]
    modY = (distY * scalar) + p1[1]

    return [modX, modY]

x_coords = [213.5500031,234.3809357,255.211853,276.0427856,296.8737183,317.7046204,340.1997681,364.3751221,388.5505066,414.8896484,444.5192261,478.5549622,514.5779419,545.4779053,570.3830566,588.0241699,598.2469482,599.772583,596.758728,593.7449341,590.7310791,593.373291,610.0373535,642.1326294,677.4451904,710.0697021,737.6887817,764.4020386,791.1152954,817.8284912,844.541687,871.2550049,897.9682007,924.6813965,951.3945923,978.1078491,1009.909546,1042.689941,1068.179199,1089.543091]
y_coords = [487.3099976,456.8832703,426.4565125,396.0297852,365.6030273,335.1763,306.0349426,278.1913452,250.3477478,224.7166748,203.0908051,191.2358704,197.6810608,217.504303,244.4946136,276.7698364,312.0551453,348.6885986,385.4395447,422.1904297,458.9414063,495.5985413,527.0128479,537.1477661,527.6642456,510.959259,486.6988525,461.2799683,435.8611145,410.4422913,385.023468,359.6045532,334.18573,308.7669067,283.3480835,257.929184,239.4429474,253.6099091,280.1803284,310.158783]
plt.plot(x_coords,y_coords,color='b')
plt.scatter(x_coords,y_coords,s=2)

new_line_x = []
new_line_y = []

for tgt in range(len(x_coords)-1):
    #tgt = randint(0, len(x_coords)-1)
    next_pt = tgt+1
    new_pt = move_along_line([x_coords[tgt],y_coords[tgt]], [x_coords[next_pt],y_coords[next_pt]], uniform(0, 1))
    new_line_x.append(new_pt[0])
    new_line_y.append(new_pt[1])

plt.plot(new_line_x,new_line_y,color='r')
plt.scatter(new_line_x,new_line_y,s=10)
ax = plt.gca()
ax.set_aspect('equal')
plt.show()

示例效果

非常感谢!


内容的提问来源于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.02 00:05:46