前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[1106]python bezier(贝塞尔)曲线

[1106]python bezier(贝塞尔)曲线

作者头像
周小董
发布于 2022-04-13 07:08:27
发布于 2022-04-13 07:08:27
1.1K00
代码可运行
举报
文章被收录于专栏:python前行者python前行者
运行总次数:0
代码可运行

文章目录

首先简单了解一下什么是贝塞尔曲线(余弦函数曲线我就不多说了哈!),贝塞尔曲线又称贝兹曲线,是法国工程师皮埃尔.贝塞尔于1962年发表。贝塞尔曲线广泛应用于二维绘图软件,早期用于汽车车体设计。

三阶贝塞尔曲线

三阶贝塞尔曲线由如下方程描述:

其中t的范围是0到1的闭区间。P0和P3是三阶贝塞尔曲线的起点和终点,P1和P2是曲线的控制点。

然后我们讲一下计算机绘制曲线的原理。从数学定义上,一条连续函数曲线有无数个点,从算法的特点将,算法具有有穷性。所以我们不可能把所有的点全部刻画在屏幕上。另一方面,计算机的屏幕像素是离散的,无法表示连续的曲线。于是引入一个概念,那就是微分思想。将曲线分为一个个小段,将曲线“化曲为直”。

最后说明一下计算机屏幕的坐标系。数学里的笛卡尔坐标系通常以水平向右为x轴正方向,垂直于x轴向上为y轴正方向。而计算机屏幕表示像素点时,其坐标原点位于屏幕左上角,x轴水平向右,而y轴垂直于x轴向下。

下面展示贝赛尔曲线函数代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def tri_bezier(p1,p2,p3,p4,t):
    parm_1 = (1-t)**3
    parm_2 = 3*(1-t)**2 * t
    parm_3 = 3 * t**2 * (1-t)
    parm_4 = t**3
 
    px = p1[0] * parm_1 + p2[0] * parm_2 + p3[0] * parm_3 + p4[0] * parm_4
    py = p1[1] * parm_1 + p2[1] * parm_2 + p3[1] * parm_3 + p4[1] * parm_4
    
    return (px,py)

效果展示:

python bezier曲线

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install bezier

手写bezier公式,生成bezier代码, 如果给的点数过多,则会生成一半bezier曲线,剩下的一半就需要进行拼接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt
import bezier
b_xs = []
b_ys = []


# xs表示原始数据
# n表示阶数
# k表示索引
def one_bezier_curve(a, b, t):
    return (1 - t) * a + t * b


def n_bezier_curve(xs, n, k, t):
    if n == 1:
        return one_bezier_curve(xs[k], xs[k + 1], t)
    else:
        return (1 - t) * n_bezier_curve(xs, n - 1, k, t) + t * n_bezier_curve(xs, n - 1, k + 1, t)


def bezier_curve(xs, ys, num, b_xs, b_ys):
    n = 5  # 采用5次bezier曲线拟合
    t_step = 1.0 / (num - 1)
    # t_step = 1.0 / num
    print(t_step)
    t = np.arange(0.0, 1 + t_step, t_step)
    print(len(t))
    for each in t:
        b_xs.append(n_bezier_curve(xs, n, 0, each))
        b_ys.append(n_bezier_curve(ys, n, 0, each))


def func():
    xs = [1.0, 2.1, 3.0, 4.0, 5.0, 6.0]
    ys = [0, 1.1, 2.1, 1.0, 0.2, 0]
    num = 20

    bezier_curve(xs, ys, num, b_xs, b_ys)  # 将计算结果加入到列表中
    print(b_xs, b_ys)
    plt.figure()
    plt.plot(b_xs, b_ys, 'r')  # bezier曲线
    # plt.plot(xs, ys)  # 原曲线
    # plt.show()

func()

拼接bezier曲线

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def point_bezier(avoid_point):
    global p
    xs = avoid_point[0, 0]  # 0
    ys = avoid_point[1, 0]  # 0
    xe = avoid_point[0, -1]  # 34.5844
    ye = avoid_point[1, -1]  # 0
    Latoff = 2.3
    startp = np.array([xs, ys])
    endp = np.array([xe, ye])
    endp1 = np.array([xe+2, ye])
    # print(startp, endp)
    P0 = startp
    P1 = np.array([startp[0] + (endp[0] - startp[0]) / 8, startp[1]])
    P2 = np.array([startp[0] + (endp[0] - startp[0]) / 8 * 2, startp[1]])
    P3 = np.array([startp[0] + (endp[0] - startp[0]) / 8 * 2, startp[1] + Latoff])
    P4 = np.array([startp[0] + (endp[0] - startp[0]) / 8 * 3, startp[1] + Latoff])
    P5 = np.array([startp[0] + (endp[0] - startp[0]) / 8 * 4, startp[1] + Latoff])
    P6 = np.array([startp[0] + (endp[0] - startp[0]) / 8 * 5, startp[1] + Latoff])
    P7 = np.array([startp[0] + (endp[0] - startp[0]) / 8 * 6, startp[1] + Latoff])
    P8 = np.array([startp[0] + (endp[0] - startp[0]) / 8 * 6, startp[1] + Latoff])
    P9 = np.array([startp[0] + (endp[0] - startp[0]) / 8 * 7, startp[1]])
    P10 = endp
    P11 = endp1
    i = 1
    half_length = 0.5 * (xe + xs)
    for u in np.arange(startp[0], startp[0] + (endp[0] - startp[0]) / 2, 0.2):
        # for u =startp[0]:0.2: startp[1] + (endp[1] - startp[1]) / 2
        c = (1 - (u - startp[0]) / half_length) ** 5 * P0 + 5 * (1 - (u - startp[0]) / half_length) ** 4 * (
                u - startp[0]) / half_length * P1 + 10 * (1 - (u - startp[0]) / half_length) ** 3 * (
                    (u - startp[0]) / half_length) ** 2 * P2 + 10 * (1 - (u - startp[0]) / half_length) ** 2 * (
                    (u - startp[0]) / half_length) ** 3 * P3 + 5 * (1 - (u - startp[0]) / half_length) * (
                    (u - startp[0]) / half_length) ** 4 * P4 + ((u - startp[0]) / half_length) ** 5 * P5
        i = i + 1
        p = np.append(p, [c], axis=0)

    for u in np.arange(startp[0] + half_length, endp[0], 0.2):
        d = (1 - (u - startp[0] - half_length) / half_length) ** 5 * P6 + 5 * (
                    1 - (u - startp[0] - half_length) / half_length) ** 4 * (
                    u - startp[0] - half_length) / half_length * P7 + 10 * (
                        1 - (u - startp[0] - half_length) / half_length) ** 3 * (
                    (u - startp[0] - half_length) / half_length) ** 2 * P8 + 10 * (
                        1 - (u - startp[0] - half_length) / half_length) ** 2 * (
                    (u - startp[0] - half_length) / half_length) ** 3 * P9 + 5 * (
                        1 - (u - startp[0] - half_length) / half_length) * (
                    (u - startp[0] - half_length) / half_length) ** 4 * P10 + (
                        (u - startp[0] - half_length) / half_length) ** 5 * P11
        i = i + 1
        p = np.append(p, [d], axis=0)
    return p
    # print(p)
    # plt.plot(p[:, 0], p[:, 1], 'r')
    # plt.show()

使用python 内置bezier包,完成bezier曲线(使用前需安装bezier包)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a = np.array([[1.0, 2.1, 3.0, 4.0, 5.0, 6.0], [0, 1.1, 2.1, 1.0, 0.2, 0]])
curve = bezier.Curve(a, degree=5)
# print(curve)
s_vals = np.linspace(0.0, 1.0, 30)
data = curve.evaluate_multi(s_vals)
x33 = data[0]
y33 = data[1]
plt.plot(x33, y33, 'y', linewidth=2.0, linestyle="-", label="y2")
plt.show()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/03/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Win10系统配置Python3.6+OpenGL环境详细步骤
1、首先登录https://www.opengl.org/resources/libraries/glut/,下载下图箭头所指的文件 2、解压缩,如下图所示: 3、粗暴一点,把这些文件全部选中,然后复
Python小屋屋主
2018/04/16
11.5K0
Win10系统配置Python3.6+OpenGL环境详细步骤
电信网络拓扑图自动布局之曲线布局
该文章介绍了如何通过编辑器的控制台命令来配置H5的输出分辨率,以达到在H5中根据不同的屏幕尺寸输出不同分辨率的图像,以解决H5在不同机型上适配的问题。同时,文章还介绍了如何使用H5的代码分割和加载机制来实现更灵活的分发方式,从而更好地适应不同的游戏需求。
HT for Web
2018/01/03
1.1K0
电信网络拓扑图自动布局之曲线布局
Python SciPy 实现最小二乘法
Scipy 对优化最小二乘 Loss 的方法做了一些封装,主要有 scipy.linalg.lstsq 和 scipy.optimize.leastsq 两种,此外还有 scipy.optimize.curve_fit 也可以用于拟合最小二乘参数。
为为为什么
2023/04/08
1.5K0
Python SciPy 实现最小二乘法
机器学习: 可视化反卷积操作
转置卷积是用于生成图像的,尽管它们已经存在了一段时间,并且得到了很好的解释——我仍然很难理解它们究竟是如何完成工作的。我分享的文章[1]描述了一个简单的实验来说明这个过程。我还介绍了一些有助于提高网络性能的技巧。
数据科学工厂
2023/03/21
2930
机器学习: 可视化反卷积操作
贝塞尔曲线
贝塞尔曲线 (Bézier Curve) 是由法国工程师皮埃尔·贝兹 (Pierre Bézier) 于 1962 年所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计 1。贝塞尔曲线最初由保尔·德·卡斯特里奥 (Paul de Casteljau) 于 1959 年运用德卡斯特里奥算法 (De Casteljau’s Algorithm) 开发,以稳定数值的方法求出贝塞尔曲线。
为为为什么
2024/09/20
1270
贝塞尔曲线
贝塞尔曲线算法:求 t 在三阶贝塞尔曲线上的点、切向量、法向量
我们有 p1(锚点 1)、cp1(控制点 1)、cp2(控制点 2)、p2(锚点 2) 表示的一条三阶贝塞尔曲线,给定曲线参数 t,求其对应的点位置,以及这个点的切向量和法向量。
前端西瓜哥
2024/07/31
5280
贝塞尔曲线算法:求 t 在三阶贝塞尔曲线上的点、切向量、法向量
Android绘图最终篇之大战贝塞尔三次曲线
零、前言 1.可以说贝塞尔曲线是一把 "石中剑",能够拔出它,会让你的绘图如虎添翼。 2.今天要与贝塞尔曲线大战三百回合,将它加入我的绘图大军麾下。 3.自此Android绘图五虎将:Canvas,Path,Paint,Color,贝塞尔便集结完成。 4.本项目源码见文尾捷文规范第一条,视图源码在view包,分析工具在analyze包 ---- 一、贝塞尔三次曲线初体验 1.无网格,不曲线,废话不多说,上网格+坐标系 /** * 作者:张风捷特烈<br/> * 时间:2018/11/16 0
张风捷特烈
2018/11/21
7990
使用Bezier曲线移动
Bézier curve(贝塞尔曲线)是应用于二维图形应用程序的数学曲线。 曲线定义:起始点、终止点(也称锚点)、控制点。通过调整控制点,贝塞尔曲线的形状会发生变化。1962年,法国数学家Pierre Bézier第一个研究了这种矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名,称为贝塞尔曲线。
keyle
2024/11/01
1260
使用Bezier曲线移动
Computational Geometry in Python
This post is a simplified version of the accompanying notebook to chapter 6 of my upcoming book Mastering SciPy. Click anywhere on this box for more information.
周星星9527
2020/11/03
1.2K0
Matplotlib 中文用户指南 3.8 路径教程
位于所有matplotlib.patch对象底层的对象是Path,它支持moveto,lineto,curveto命令的标准几个,来绘制由线段和样条组成的简单和复合轮廓。 路径由(x,y)顶点的(N,2)数组,以及路径代码的长度为 N 的数组实例化。 例如,为了绘制(0,0)到(1,1)的单位矩形,我们可以使用这个代码:
ApacheCN_飞龙
2022/12/01
6370
Matplotlib 中文用户指南 3.8 路径教程
OpenGL ES 绘制贝塞尔曲线
最近要求为图像设计流线型曲线边框,想着可以用 OpenGL 绘制贝塞尔曲线,再加上模板测试来实现,趁机尝试一波。
字节流动
2020/06/02
1.3K0
游戏开发中的贝塞尔曲线,曲线和路径
贝塞尔曲线是自然几何形状的数学近似。我们使用它们来表示一条曲线,该曲线具有尽可能少的信息并具有很高的灵活性。
海拥
2021/08/23
1.1K0
【干货满满】贝塞尔曲线(Bézier curve)——什么神仙操作
学习CSS的小伙伴应该会知道一个叫做animation-timing-function:cubic-bezier(x1,y1,x2,y2)的参数,用于CSS动画时间的参数。如果无法理解,就假象下匀速运动和变速运动的。如果还是没感觉,就想象你在跑步机上跑步,1小时内,有时用8KM/h的速度,有时候用10KM/h的速度。也就是animation-timing-function:cubic-bezier(x1,y1,x2,y2)的意思就是让你在一定时间内,用不同的速度运动(运动方式不限,可以是平移,旋转,拉伸……)。
小美娜娜
2019/04/04
2.4K0
【干货满满】贝塞尔曲线(Bézier curve)——什么神仙操作
【Unity3d游戏开发】游戏中的贝塞尔曲线以及其在Unity中的实现
  RT,马三最近在参与一款足球游戏的开发,其中涉及到足球的各种运动轨迹和路径,比如射门的轨迹,高吊球,香蕉球的轨迹。最早的版本中马三是使用物理引擎加力的方式实现的足球各种运动,后来的版本中使用了根据物理学公式手动计算位置和物体速度的方式实现,现在这个版本中使用的是DoTween+贝塞尔曲线调节来实现。(关于它们之间的各种优缺点我们会在以后单独开一篇博客来探讨,届时也会放出源代码互相学习下)好了,言归正传,今天马三就来和大家一起学习一下游戏中的贝塞尔曲线以及其在Unity中如何实现。
马三小伙儿
2018/09/12
4.4K0
【Unity3d游戏开发】游戏中的贝塞尔曲线以及其在Unity中的实现
[MXNet逐梦之旅]实战一·使用MXNet拟合曲线(对比MXNet,PyTorch与TensorFlow实现的区别)
在之前的博文中我们用TensorFlow与PyTorch进行了拟合曲线,到达了不错的效果。 我们现在使用MXNet进行相同的曲线拟合,进而来比较一下TensorFlow与PyTorch的异同。 搭建神经网络进行训练的步骤基本相同,我们现在开始用MXNet来实现。
小宋是呢
2019/06/27
9100
[MXNet逐梦之旅]实战一·使用MXNet拟合曲线(对比MXNet,PyTorch与TensorFlow实现的区别)
Python+Matplotlib可视化三次贝塞尔曲线的4个调和函数
确定一条n次贝塞尔曲线需要n+1个控制点和n+1个对应的调和函数,每个调和函数的定义域和值域都为[0,1],且所有调和函数值之和恒等于1,与自变量取值无关。以三次贝塞尔曲线为例,需要4个控制点(记为P1、P2、P3、P4),相应的4个调和函数的表达式分别为:
Python小屋屋主
2022/06/05
9410
Python+Matplotlib可视化三次贝塞尔曲线的4个调和函数
数据平滑9大妙招
对数据进行平滑处理的方法有很多种,具体的选择取决于数据的性质和处理的目的。今天给大家分享9大常见数据平滑方法:
皮大大
2023/10/13
4K0
Android 自定义View高级特效,神奇的贝塞尔曲线
(这就是贝塞尔曲线 ) 投稿作者:一口仨馍/csdn 原文链接: http://blog.csdn.net/qq_17250009/article/details/51027183 效果图 效果图中
非著名程序员
2018/02/02
2.1K0
Android 自定义View高级特效,神奇的贝塞尔曲线
根据贝塞尔曲线上的点反算t值
这是一个项目中遇到的实际需求。 场景是一个智能仓库管理系统,场景里面有直线和曲线构成的环穿轨道。环穿轨道上面会有小车运动,后台推动小车的两个点位A和B,其中A和B都会在轨道上面,前端需要根据这两个推送点,自动播放小车从A点沿轨道到B点的动画。下面是项目截图:
用户3158888
2019/10/09
2.1K0
根据贝塞尔曲线上的点反算t值
Android之贝赛尔曲线及其应用场景
导语 本文对贝赛尔曲线的公式及推导过程进行了深入学习,同时结合网上的资料,整理了一些其常用的应用场景。 前段时间做送礼动画需求的时候遇到送礼轨迹需要平滑的要求,因此对常用的平滑轨迹贝赛尔曲线进行了
MelonTeam
2018/01/04
1.8K0
Android之贝赛尔曲线及其应用场景
推荐阅读
相关推荐
Win10系统配置Python3.6+OpenGL环境详细步骤
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验