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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:33:34