[python bezier贝塞尔曲线] 数值解法、德卡斯特里奥解法解法以及bezier库的使用demo

news2024/11/16 11:26:19

修改自这个老哥的,非常的nice,此处仅作为学习记录

matplotlib==3.7.0 可行

Note: 数值解法是真的快

先上图

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import math
import time


class Bezier:
    def __init__(self, Points, InterpolationNum):
        # 输入控制点,Points是一个array,num是控制点间的插补个数
        self.pointsNum = Points.shape[0]  # 控制点的个数
        self.demension = Points.shape[1]  # 点的维度
        self.order = Points.shape[0] - 1  # 贝塞尔阶数=控制点个数-1
        self.num = InterpolationNum  # 相邻控制点的插补个数
        self.Points = Points

    def DigitalAlgo(self):
        # 数值解法
        PB = np.zeros((self.pointsNum, self.demension))  # 求和前各项
        pis = []  # 插补点
        for u in np.arange(0, 1 + 1 / self.num, 1 / self.num):
            for i in range(0, self.pointsNum):
                PB[i] = (math.factorial(self.order) / (
                        math.factorial(i) * math.factorial(self.order - i))) * (u ** i) * (
                                1 - u) ** (self.order - i) * self.Points[i]
            pi = sum(PB).tolist()  # 求和得到一个插补点
            pis.append(pi)
        return np.array(pis)

    def DeCasteljauAlgo(self):
        # 德卡斯特里奥解法
        pis = []  # 插补点
        for u in np.arange(0, 1 + 1 / self.num, 1 / self.num):
            Att = self.Points
            for i in np.arange(0, self.order):
                for j in np.arange(0, self.order - i):
                    Att[j] = (1.0 - u) * Att[j] + u * Att[j + 1]
            pis.append(Att[0].tolist())

        return np.array(pis)

    def __call__(self, method):
        # 获取Bezeir所有插补点
        if method == 0:
            return self.DigitalAlgo()
        if method == 1:
            return self.DeCasteljauAlgo()


points = np.array([
    [1, 3, 0],
    [1.5, 1, 0],
    [4, 2, 0],
    [4, 3, 4],
    [2, 3, 11],
    [5, 5, 9],
    [1, 3, 0],
    [1.5, 1, 0],
    [4, 2, 0],
    [4, 3, 4],
    [2, 3, 11],
    [5, 5, 9]
])
points[6:, ...] = 5 + points[6:, ...]

# points = np.array([
#     [0.0, 0.0, 0.],
#     [1.0, 0.0, 1.],
#     [1.0, 1.0, 1.],
#     [0.0, 1.0, 2.],
# ])


if points.shape[1] == 3:
    fig = plt.figure()
    ax = fig.add_axes(Axes3D(fig))

    # 标记控制点
    for i, point in enumerate(points, 1):
        ax.scatter(point[0], point[1], point[2], marker='o', color='r')
        ax.text(point[0], point[1], point[2], i, size=12)

    # 直线连接控制点
    ax.plot3D(points[:, 0], points[:, 1], points[:, 2], color='k')

    # 贝塞尔曲线连接控制点
    s = time.time()
    matpi = Bezier(points, 10000)(0)
    print(f'{time.time() - s:.5f}s')
    ax.plot3D(matpi[:, 0], matpi[:, 1], matpi[:, 2], color='r')
    plt.show()

    # 0 0.12295s
    # 1 0.35341s

if points.shape[1] == 2:
    # 标记控制点
    for i, point in enumerate(points, 1):
        plt.scatter(point[0], point[1], point[2], marker='o', color='r')
        plt.text(point[0], point[1], point[2], i, size=12)

    # 直线连接控制点
    plt.plot(points[:, 0], points[:, 1], color='k')

    # 贝塞尔曲线连接控制点
    matpi = Bezier(points, 1000)(1)
    plt.plot(matpi[:, 0], matpi[:, 1], color='r')
    plt.show()

 推荐一下bezier这个库画bezier贝塞尔曲线

也非常的好用,具体的看官方例程吧....

不会安装的看这个详细的

(159条消息) [python 安装bezier的问题] win11 The BEZIER_INSTALL_PREFIX environment variable must be set._12..的博客-CSDN博客

import bezier
import numpy as np
import matplotlib.pyplot as plt

nodes1 = np.array([
    [0.0, 0.5, 1.0],
    [0.0, 1.0, 0.0],
])
nodes2 = np.array([
    [0.0, 0.25, 0.5, 0.75, 1.0],
    [0.0, 2.0, -2.0, 2.0, 0.0],
])

print(nodes2)
curve1 = bezier.Curve(nodes1, degree=2)
curve2 = bezier.Curve.from_nodes(nodes2)
intersections = curve1.intersect(curve2)

s_vals = np.array(intersections[0, :])
points = curve1.evaluate_multi(s_vals)


ax = curve1.plot(num_pts=256)
_ = curve2.plot(num_pts=256, ax=ax)
lines = ax.plot(
    points[0, :], points[1, :],
    marker="o", linestyle="None", color="black")

# ax.plot(nodes1[0, :], nodes1[1, :], label='l1')
# ax.plot(nodes2[0, :], nodes2[1, :], label='l2')
# ax.axis("scaled")
ax.set_xlim(-0.125, 1.125)
ax.set_ylim(-0.0625, 0.625)
plt.legend()
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/605292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用HTML5开发Kinect体感游戏

一、简介 我们要做的是怎样一款游戏? 在前不久成都TGC2016展会上,我们开发了一款《火影忍者手游》的体感游戏,主要模拟手游章节《九尾袭来 》,用户化身四代,与九尾进行对决,吸引了大量玩家参与。 表面上看…

Makerbase SimpleFOC ESP32 例程5 双电机闭环位置测试

Makerbase SimpleFOC ESP32 例程5 双电机闭环位置测试 第一部分 硬件介绍 1.1 硬件清单 序号品名数量1ESP32 FOC V1.0 主板12YT2804电机2312V电源适配器14USB 线156pin杜邦线2 注意:YT2804是改装的云台无刷电机,带有AS5600编码器,可实现360连续运转。…

香蕉派(Banana Pi) BPi-P2 Zero开源硬件物联网开发板评测

我们从制造商处收到的样品 BPi-P2 Zero 和 BPi-P2 Maker SBC 用于本次审查的体验非常好。这些都是基于多年H3/H2 SoC使用经验的高质量硬件实现。 优点 优良的价格和适用性稳定且经过验证的架构低散热供电电源WiFi / 蓝牙 kod 零模型完美平衡的 Maker 模型 Banana Pi BPi-P2 的…

设备树与pinctrl

设备树与pinctrl 原理:芯片内部有个内存控制器访问芯片的各个控制器单元(如IIC、USB等), 阅读手册设置其相应功能即可。 设备树 是一种描述硬件的数据结构,由专门文件格式与语法结构。 pinctrl Pinctrl:Pin Contr…

vue-router(element侧导栏,子组件内容切换,不传参)使用的详细步骤

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

如何申请免费ChatGPT 2500刀初创金

近日OpenAI 推出了OpenAI for Startups项目,那么什么是Startups项目呢: 它是由全球知名的人工智能研究公司 OpenAI 推出的一个开放式的创业计划,旨在为初创公司提供一种新的激励机制和技术推广方式。 也就是说我们可以用自己账号申请&#x…

【软件工程题库】第四章 概要设计

🕺作者: 迷茫的启明星 学习路线C语言从0到1C初阶数据结构从0到1 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…

淬体归元,运营商资源域元数据管理

资源元数据是通信行业资源管理业务开展的基础性支撑要素,它定义了资源业务领域相关概念、关系和规则,即各种设施、缆线、设备、链路等网络资源的规格、属性、字典及相关存储模型等信息。高质量的元数据是提升业务效率、加强管理与分析能力的必要条件&…

多线程安全的案例展示与解决方案

一、概念 1. 什么是线程安全 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果&#xff0c…

为什么HTTPS是安全的?

在谈论 HTTPS 协议之前,先来回顾一下 HTTP 协议的概念。 1. HTTP 协议 1.1 HTTP 协议介绍 HTTP 协议是一种基于文本的传输协议,它位于 OSI 网络模型中的应用层。 HTTP 协议是通过客户端和服务器的请求应答来进行通讯,目前协议由之前的 RFC…

Java程序设计入门教程--成员变量

成员的分类 实例成员 实例成员是属于对象的,即属于对象级别,包括实例成员属性(也称为实例成员变量)和实例成员方法,只有创建了对象之后才能访问实例成员属性和实例成员方法。 类成员 类成员属于类的,类成…

Stable Diffusion学习笔记

文章目录 参考资料△ 安装与环境配置○ 安装Python 人工智能真是厉害。。。 我也不能落后 虽然前面pytorch还没有学完,但是热点总是在变的嘛,现在大模型和生成式AI这么火,我也来蹭蹭热度。 就从学习怎么用AIGC工具生成 老婆 纸片人开始吧 …

app的动态导航栏及自定义图标的开发

效果展示 我的代码 <template><div class"nav-container"><!-- 动态底部导航栏 start--><div class"nav-content"><van-tabbar style"background-image: linear-gradient(135deg, #EE9AE5 10%, #5961F9 100%) !import…

防火墙之流量管理

防火墙流量管理 原理概述&#xff1a; 防火墙&#xff08;英语&#xff1a;Firewall&#xff09;技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备&#xff0c;帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障&#xff0c;以保护用户资料与信息安全性的一…

【Python 文本分析】零基础也能轻松掌握的学习路线与参考资料

Python 常用的文本分析工具有很多&#xff0c;如 Natural Language Toolkit (NLTK)、TextBlob、spaCy、Jieba等。本文将分别介绍这些工具及其对应的学习路线、参考资料和优秀实践。 Natural Language Toolkit (NLTK) Natural Language Toolkit (NLTK) 是 Python 中文本分析研…

记一次Java生成SQL脚本文件换行格式为window/unix的笔记

今天在做一个SQL脚本文件生成需求&#xff0c;其中&#xff0c;需要设置&#xff1a; 文件编码为&#xff1a;UTF-8文件换行格式为&#xff1a;UNIX UTF-8这个好说&#xff0c;因为java代码可以指定文件编码&#xff0c;如&#xff1a; 但是Unix换行格式就很神奇了&#xff0…

职场恶霸00后,看完这篇你就知道了

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&#x…

032:Mapbox GL实现卷帘功能,可开启、关闭

第032个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中实现地图卷帘功能,这里可以设置开启、关闭卷帘。根据参数的不同,可以配置相关的功能,请参考底部的API信息。本示例比较重要的一点是要知道如何引用mapbox-gl-compare插件。 直接复制下面的 vue+mapbox源…

SpringData 进阶篇-上

SpringData 一&#xff1a;背景介绍二&#xff1a;XML配置 与JavaConfig配置2.1 XML配置2.1.1 配置文件2.1.2 具体使用 2.2 JavaConfig配置2.2.1 配置类2.2.2 具体使用&#xff1a; 三&#xff1a;SpringDataJpa的CRUD3.1 接口代码3.2 具体使用3.3 其它方法3.4 分页方法 四&am…

【数据集处理】中国地面气候资料日值数据集(V3.0)

1 数据集介绍-中国地面气候资料日值数据集(V3.0) 中国地面气候资料日值数据集(V3.0)包含以下气象数据资料(包括降水、气温、风速等)。 2 数据处理 以湿度数据(RHU) 处理为例,数据文件如下: 2.1 步骤1:从文件中提取数据 首先提取所有需要的有效信息,查看【数据表格…