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

如何用Python绘制铁路轨道样式的带图案曲线

实现带均匀间距图案的曲线绘制方案

一、基于Pillow的手动实现方法

Pillow没有原生支持图案线条绘制,你可以手动按以下步骤实现铁路轨道样式的曲线:

  • 生成平滑路径的密集采样点
    先把你的坐标点转换成连续平滑曲线(比如用贝塞尔曲线拟合,或直接用ImageDraw.line()绘制平滑线条后,对路径进行像素级采样)。也可以用数学方法计算曲线上的等距采样点,保证后续图案的均匀性。
  • 沿路径绘制均匀间距的轨道图案
    铁路轨道是成对的垂直短条,核心是按路径的实际长度控制间距:
    1. 先计算整条路径的总长度,再按你设定的间距(比如每20像素一个图案单元)划分路径段。
    2. 对每个图案单元的位置,计算当前点的切线方向,然后在切线的垂直方向(轨道两侧)绘制黑色短条。

示例代码片段:

from PIL import Image, ImageDraw
import math

# 假设已生成平滑路径的采样点列表path_points,每个元素为(x,y)
img = Image.new("RGB", (800, 600), "white")
draw = ImageDraw.Draw(img)

# 自定义参数
bar_length = 10    # 轨道短条的长度
bar_width = 2      # 短条的宽度
spacing = 20       # 图案单元之间的间距

# 计算路径总长度
total_length = 0
prev_point = path_points[0]
for point in path_points[1:]:
    dx = point[0] - prev_point[0]
    dy = point[1] - prev_point[1]
    total_length += math.hypot(dx, dy)
    prev_point = point

# 沿路径遍历,按间距绘制轨道图案
current_length = 0
prev_point = path_points[0]
for point in path_points[1:]:
    dx = point[0] - prev_point[0]
    dy = point[1] - prev_point[1]
    segment_length = math.hypot(dx, dy)
    
    if current_length + segment_length >= spacing:
        # 计算当前图案单元的位置坐标
        ratio = (spacing - current_length) / segment_length
        x = prev_point[0] + dx * ratio
        y = prev_point[1] + dy * ratio
        
        # 计算切线的垂直方向向量(轨道的左右方向)
        tangent_norm = math.hypot(dx, dy)
        if tangent_norm == 0:
            continue
        perp_x = -dy / tangent_norm
        perp_y = dx / tangent_norm
        
        # 绘制左右两侧的短条
        left_start = (x - perp_x * bar_length/2, y - perp_y * bar_length/2)
        left_end = (x + perp_x * bar_length/2, y + perp_y * bar_length/2)
        right_start = (x + perp_x * bar_length/2, y + perp_y * bar_length/2)
        right_end = (x - perp_x * bar_length/2, y - perp_y * bar_length/2)
        
        draw.line([left_start, left_end], fill="black", width=bar_width)
        draw.line([right_start, right_end], fill="black", width=bar_width)
        
        # 更新当前已走过的路径长度
        current_length = current_length + segment_length - spacing
    else:
        current_length += segment_length
    prev_point = point

img.save("railway_track.png")

二、更高效的工具推荐

如果手动实现太繁琐,可以试试这些工具:

  • Matplotlib:用LineCollection结合自定义图案,或通过path模块生成路径后,沿路径平铺预设图案,对路径的处理更灵活,能轻松保证图案间距均匀。
  • Pycairo:专业2D绘图库,支持路径上的图案填充。你可以先制作包含一对短条的小图案,再将图案绑定到路径上,设置变换矩阵让图案沿路径均匀平铺,是实现这类需求的最优选择之一。
  • OpenCV:先绘制平滑曲线,再通过计算路径骨架点,在垂直方向批量绘制短条,适合对性能要求较高的场景。

三、关键注意事项

  • 采样点密度要足够高,否则曲线切线计算会出现偏差,导致短条方向错误。
  • 必须基于路径的实际长度计算间距,而不是像素点的数量,这样才能保证弯曲处的图案间距和直线段一致。
  • 如果需要拟合原始坐标点生成平滑曲线,可使用scipy.interpolate的相关函数生成参数化曲线,方便按长度精准采样。

内容的提问来源于stack exchange,提问作者pepoluan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:20:30