Python生成线段间可偏移随机凹抛物线辊轮廓求助
随机凹抛物线辊轮廓生成实现
需求说明
- 开发辊轮廓(roller contours)绘制功能,辊半径支持灵活调整,目标生成轮廓为凹抛物线形态
- 需要支持批量生成随机辊轮廓:不同辊的半径存在差异,辊间抛物线结构可随机变化
- 抛物线无需强制对齐y=0轴,支持左右位置偏移
- 现有示例代码通用性较差,需要引入Python
random模块改造实现自动随机生成能力
原有示例代码
import matplotlib.pyplot as plt import numpy as np import random def rec(): x = list(np.arange(-15, 16, 1)) y = [-35, 35] y0 = [] for xv in x: p = (xv, y[0]) y0.append(p) y1 = [] for xv in x: q = (xv, y[-1]) y1.append(q) x_range = [elx[0] for elx in y0] y_nve = [ely[1] for ely in y0] y_pve = [ely[1] for ely in y1] return x, x_range, y_nve, y_pve def parabolic_ins(): x, x_range, y_nve, y_pve = rec() nl = [] xr = [] for xp, yp in zip(x, y_pve): if -7 <= xp <= 7: a = 1 b = 0 c = 2 yc = yp yp = a * (xp ** 2) # yp值不能超过35,避免抛物线偏移到边角位置 if yp <= yc: nl.append(yp) xr.append(xp) print(nl, xr) else: nl.append(yp) xr.append(xp) nk = [-x for x in nl] aa = xr + xr bb = nl + nk plt.plot(aa, bb) plt.show() parabolic_ins()
改造后可直接运行的实现代码
import matplotlib.pyplot as plt import numpy as np import random def generate_single_roller( x_total_range=(-15, 16), x_step=0.1, radius_range=(25, 40), parabola_width_range=(5, 10), parabola_offset_range=(-5, 5), parabola_depth_range=(0.3, 1.2) ): """生成单个随机凹抛物线辊轮廓坐标 参数说明: x_total_range: 辊整体x轴取值范围 x_step: 坐标点采样步长 radius_range: 辊半径随机取值范围 parabola_width_range: 抛物线段宽度随机范围 parabola_offset_range: 抛物线中心相对y=0轴的偏移量随机范围 parabola_depth_range: 抛物线凹入深度系数随机范围 """ # 随机生成当前辊的基础半径 base_radius = random.uniform(*radius_range) # 随机生成抛物线段半宽 parabola_half_width = random.uniform(*parabola_width_range) # 随机生成抛物线中心x轴偏移 parabola_center_x = random.uniform(*parabola_offset_range) # 随机生成抛物线二次项系数,控制凹入深度 a = random.uniform(*parabola_depth_range) # 校准系数,保证抛物线边缘和直线段平滑衔接,不超出辊半径 edge_y = a * (parabola_half_width **2) a = a * (base_radius / edge_y) * 0.95 x = np.arange(x_total_range[0], x_total_range[1], x_step) y_upper = np.ones_like(x) * base_radius # 计算抛物线作用区间 parabola_left = parabola_center_x - parabola_half_width parabola_right = parabola_center_x + parabola_half_width parabola_mask = (x >= parabola_left) & (x <= parabola_right) # 替换区间内值为抛物线值 x_parabola = x[parabola_mask] y_upper[parabola_mask] = a * (x_parabola - parabola_center_x)**2 # 拼接上下对称轮廓 x_full = np.concatenate([x, np.flip(x)]) y_full = np.concatenate([y_upper, -np.flip(y_upper)]) return x_full, y_full, base_radius, parabola_center_x def generate_n_rollers(n=3, gap=10): """生成n个并排的随机辊轮廓 n: 辊的数量 gap: 相邻辊之间的间距 """ plt.figure(figsize=(12, 6)) current_x_offset = 0 for i in range(n): x, y, r, offset = generate_single_roller() # 沿x轴偏移当前辊位置,避免重叠 x = x + current_x_offset plt.plot(x, y, label=f'辊{i+1}, 半径={r:.1f}, 抛物线偏移={offset:.1f}') # 更新下一个辊的起始偏移量 current_x_offset = x.max() + gap plt.axis('equal') plt.legend() plt.title('随机生成凹抛物线辊轮廓') plt.show() # 生成5个随机辊示例 if __name__ == "__main__": generate_n_rollers(n=5)
核心改造点
- 所有可变参数均支持随机取值,可直接调整参数范围控制随机生成的效果边界
- 抛物线中心位置支持随机左右偏移,不再强制对齐y=0轴
- 内置系数自动校准逻辑,保证抛物线边缘和辊身直线段平滑衔接,不会超出辊半径边界
- 支持批量生成任意数量的辊,不同辊的半径、抛物线宽度、凹入深度、偏移量均独立随机,生成后自动沿x轴排列避免重叠
内容的提问来源于stack exchange,提问作者Dhruv
相关产品推荐
相关产品推荐

