讲师中心 微信公众号
AI工具推荐 视频效率加速

如何消除 np.concatenate 连接曲线时产生的意外连线

酷磊同学_3610

酷磊同学_3610

发布时间:2026-09-08 20:13:02

|

580人浏览过

|

来源于php中文网

原创

如何消除 np.concatenate 连接曲线时产生的意外连线

本文详解如何在 Matplotlib 动画中拼接圆弧与正弦波路径时,避免因 np.concatenate 导致的非法连接线,并通过正确截取数组切片实现平滑过渡与动态擦除效果。

本文详解如何在 matplotlib 动画中拼接圆弧与正弦波路径时,避免因 `np.concatenate` 导致的非法连接线,并通过正确截取数组切片实现平滑过渡与动态擦除效果。

在使用 np.concatenate 拼接两段独立轨迹(如单位圆和位移后的正弦波)并用于动画绘制时,一个常见却容易被忽视的问题是:拼接点处会意外出现一条“跳跃连线”——即从圆终点直接连到正弦波起点的直线段。该线并非数据本意,而是 plt.plot() 对连续数组的默认行为:它会将相邻点用直线连接,而 x_combined 和 y_combined 中圆的最后一个点与正弦波的第一个点在数组中物理相邻,因此被强制绘制成线段。

根本原因在于:np.concatenate((x_circle, x_sine)) 生成的 x_combined 是一个连续一维数组,其末尾(圆终点)与开头(正弦波起点)在内存中紧邻;同理 y_combined 也是如此。当 line.set_data(x_combined[:frame], y_combined[:frame]) 在动画早期帧中绘制前 N 个点时,只要 N 跨越了圆与正弦波的边界,就会把圆终点和正弦起点连起来——而这正是你看到的“讨厌的连接线”。

✅ 正确解法不是修改 concatenate,而是避免将两段轨迹静态拼接成单一线条;而是在每一帧中动态构造当前可见的、逻辑上不相连的两段路径,并通过 np.concatenate 安全组合它们——前提是两段之间不共享端点,且确保连接位置无重叠或误连。

关键修复如下(替换原 update 函数中 Stage 2 的主体部分):

# Stage 2: Transition to sine wave — tail erases from the FRONT
else:
    head_frame = frame - total_circle_frames  # how far head has drawn on sine
    tail_frame = frame - total_circle_frames  # how far tail has erased

    # Initialize empty parts
    circle_part_x, circle_part_y = [], []
    sine_part_x, sine_part_y = [], []

    # Draw sine wave head (from start up to head_frame)
    if head_frame > 0:
        sine_part_x = x_sine[:head_frame]
        sine_part_y = y_sine[:head_frame]
        head.set_data([x_sine[head_frame-1]], [y_sine[head_frame-1]])  # head at latest point
    else:
        head.set_data([], [])

    # Erase circle FROM THE BEGINNING: keep only x_circle[tail_frame:], same for y
    if tail_frame < total_circle_frames:
        circle_part_x = x_circle[tail_frame:]
        circle_part_y = y_circle[tail_frame:]
        tail.set_data([x_circle[tail_frame]], [y_circle[tail_frame]])
    else:
        # Erase entire circle → tail moves onto sine wave
        tail_frame_in_sine = tail_frame - total_circle_frames
        if tail_frame_in_sine < len(x_sine):
            sine_part_x = x_sine[tail_frame_in_sine:]  # erase front of sine too
            sine_part_y = y_sine[tail_frame_in_sine:]
            tail.set_data([x_sine[tail_frame_in_sine]], [y_sine[tail_frame_in_sine]])
        else:
            tail.set_data([], [])

    # SAFELY concatenate only visible segments — no artificial link!
    line.set_data(
        np.concatenate((circle_part_x, sine_part_x)),
        np.concatenate((circle_part_y, sine_part_y))
    )

? 核心原理说明:

  • x_circle[tail_frame:] 表示“保留圆的后半段”,即从第 tail_frame 个点开始到结尾——这实现了从圆开头向后擦除的视觉效果;
  • 同理,对正弦波也采用 [tail_frame_in_sine:] 截取,确保擦除逻辑一致;
  • 因为 circle_part_x 和 sine_part_x 是分别计算、再拼接的,只要二者不人为共享端点(例如不把 x_circle[-1] 和 x_sine[0] 同时包含),np.concatenate 就不会引入额外连线;
  • 更重要的是:擦除操作改变了每帧实际传入 set_data() 的点集,而非依赖原始拼接数组的索引截断——这才是摆脱“连接线陷阱”的本质。

⚠️ 注意事项:

  • 不要直接对 x_combined[:frame] 做切片来驱动动画(这是原代码隐患所在);
  • 确保 x_sine 和 y_sine 已按需平移对齐(你已正确完成:x_sine += x_circle[-1] 等),否则即使擦除逻辑正确,视觉上仍会错位;
  • 若希望擦除更平滑,可引入插值或增加帧率,但数组切片逻辑不变;
  • blit=True 要求所有 set_data() 调用必须严格返回相同结构的对象(空列表 [] 代替 [val] 是安全的)。

通过这一重构,动画将精准呈现:先完整绘制圆 → 头部沿正弦波前进 → 尾部同步从圆起点开始擦除 → 最终仅剩正弦波,全程无任何非预期连接线。这不仅是技巧修复,更是理解 Matplotlib 绘图机制与 NumPy 数组视图本质的重要实践。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1791

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4704

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1749

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

27857

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3347

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3367

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1203

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

616

2023.08.10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn