贝塞尔曲线的一些资料收集
一本免费的在线书籍,供你在非常需要了解如何处理贝塞尔相关的事情。
https://pomax.github.io/bezierinfo/zh-CN/index.html
An algorithm to find bounding box of closed bezier curves? - Stack Overflow
https://stackoverflow.com/questions/2587751/an-algorithm-to-find-bounding-box-of-closed-bezier-curves
前端动画之贝塞尔曲线推导及应用-CSDN博客
https://blog.csdn.net/frontend_frank/article/details/123437040
贝塞尔曲线在线绘制🚀
https://www.bezier-curve.com/
Calculating / Computing the Bounding Box of Cubic Bezier https://floris.briolas.nl/floris/2009/10/bounding-box-of-cubic-bezier/
获取三阶贝塞尔曲线的最小包围盒
c# https://floris.briolas.nl/floris/2009/10/bounding-box-of-cubic-bezier/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;namespace BoundingBoxTestProject
{
public static class BezierOp
{public delegate TResult Func<T1, T2, T3, T4, T5, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);//cubic polinomal//x = At^3 + Bt^2 + Ct + D//where A,B,C,D://A = p3 -3 * p2 + 3 * p1 - p0//B = 3 * p2 - 6 * p1 +3 * p0//C = 3 * p1 - 3 * p0//D = p0 public static Func<double, double, double, double, double, double> bezierSpline = (p0, p1, p2, p3, t) =>(p3 - 3 * p2 + 3 * p1 - p0) * Math.Pow(t, 3)+ (3 * p2 - 6 * p1 + 3 * p0) * Math.Pow(t, 2)+ (3 * p1 - 3 * p0) * t+ (p0);//X = At^3 + Bt^2 + Ct + D//where A,B,C,D://A = (p3 -3 * p2 + 3 * p1 - p0)//B = (3 * p2 - 6 * p1 +3 * p0)//C = (3 * p1 - 3 * p0)//D = (p0)//We would like to know the values of t where X = 0//X = (p3-3*p2+3*p1-p0)t^3 + (3*p2-6*p1+3*p0)t^2 + (3*p1-3*p0)t + (p0)//Derivetive ://X' = 3(p3-3*p2+3*p1-p0)t^(3-1) + 2(6*p2-12*p1+6*p0)t^(2-1) + 1(3*p1-3*p0)t^(1-1) [f(x)=aX^n => f'(x)=a*n*X^(n-1) remember?]//simplified://X' = (3*p3-9*p2+9*p1-3*p0)t^2 + (6*p2-12*p1+6*p0)t + (3*p1-3*p0)//**!!reusing a,b,and c!!!***//taken as aX^2 + bX + c a,b and c are: public static Func<double, double, double, double, double> A = (p0, p1, p2, p3) => 3 * p3 - 9 * p2 + 9 * p1 - 3 * p0;//ommitting power 2 for now public static Func<double, double, double, double> B = (p0, p1, p2) => 6 * p2 - 12 * p1 + 6 * p0;public static Func<double, double, double> C = (p0, p1) => 3 * p1 - 3 * p0;//b^2 - 4ac = Determinantpublic static Func<double, double, double, double> Determinant = (a, b, c) => Math.Pow(b, 2) - 4d * a * c;public static Func<double, double, double, double[]> Solve = (a, b, c) =>{Func<double, double, double, bool, double> _Solve =(a_, b_, c_, s) =>(-b_ +(Math.Sqrt((b_ * b_) - (4d * a_ * c_)) *((s) ? 1d : -1d))) / (2d * a_);double d = Determinant(a, b, c);if (d < 0)return new double[] { };if (a == 0)//aX^2 + bX + c well then then this is a simple line//x= -c / breturn new double[] { -c / b };if (d == 0){return new double[] { _Solve(a, b, c, true) };}elsereturn new double[]{_Solve(a, b, c, true),_Solve(a, b, c, false)};};public static RectangleF GetRect(PointF p1, PointF c1, PointF c2, PointF p2){double aX = A(p1.X, c1.X, c2.X, p2.X);double bX = B(p1.X, c1.X, c2.X);double cX = C(p1.X, c1.X);double aY = A(p1.Y, c1.Y, c2.Y, p2.Y);double bY = B(p1.Y, c1.Y, c2.Y);double cY = C(p1.Y, c1.Y);var resX = Solve(aX, bX, cX).Where(t => (t >= 0) && (t <= 1)); //solve for t ==0 & filtervar resY = Solve(aY, bY, cY).Where(t => (t >= 0) && (t <= 1)); //solve for t ==0 & filter//Draw min and max;List<PointF> _BBox = new List<PointF>();_BBox.Add(p1); //Add Begin and end point not the control points!_BBox.Add(p2);foreach (var e in resX.Union(resY)){double x = bezierSpline(p1.X, c1.X, c2.X, p2.X, e);double y = bezierSpline(p1.Y, c1.Y, c2.Y, p2.Y, e);PointF p = new PointF((float)x, (float)y);_BBox.Add(p);}float minX = float.MaxValue;float minY = float.MaxValue;float maxX = float.MinValue;float maxY = float.MinValue;foreach (var e in _BBox) //find the bounding box.{minX = Math.Min(e.X, minX);minY = Math.Min(e.Y, minY);maxX = Math.Max(e.X, maxX);maxY = Math.Max(e.Y, maxY);}return new RectangleF(minX, minY, maxX - minX, maxY - minY);}}}
c++ 由上述c#代码改写而来,未做优化
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>// 表示一个边界框的结构体
struct BoundingBox {double x; // 左上角 x 坐标double y; // 左上角 y 坐标double width; // 宽度double height; // 高度BoundingBox(double _x, double _y, double _width, double _height) : x(_x), y(_y), width(_width), height(_height) {}
};// 表示一个二维点的结构体
struct Point {double x; // x 坐标double y; // y 坐标Point(double _x, double _y) : x(_x), y(_y) {}
};// 计算三次贝塞尔曲线的值
double bezierSpline(double p0, double p1, double p2, double p3, double t) {double mt = 1 - t;return mt * mt * mt * p0 + 3 * mt * mt * t * p1 + 3 * mt * t * t * p2 + t * t * t * p3;
}// 计算贝塞尔曲线的导数系数
void calculateCoefficients(double p0, double p1, double p2, double p3, double &a, double &b, double &c) {a = 3 * (p3 - 3 * p2 + 3 * p1 - p0);b = 6 * (p2 - 2 * p1 + p0);c = 3 * (p1 - p0);
}// 解二次方程 ax^2 + bx + c = 0,并返回在区间 [0, 1] 内的实数解
std::vector<double> solveQuadratic(double a, double b, double c) {std::vector<double> solutions;// 计算判别式double discriminant = b * b - 4 * a * c;if (discriminant >= 0) {double sqrtDiscriminant = std::sqrt(discriminant);double t1 = (-b + sqrtDiscriminant) / (2 * a);double t2 = (-b - sqrtDiscriminant) / (2 * a);if (t1 >= 0 && t1 <= 1) {solutions.push_back(t1);}if (t2 >= 0 && t2 <= 1) {solutions.push_back(t2);}}return solutions;
}// 计算贝塞尔曲线的边界框
BoundingBox getBoundsOfCurve(double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3) {double aX, bX, cX, aY, bY, cY;// 计算 x 和 y 方向的导数系数calculateCoefficients(x0, x1, x2, x3, aX, bX, cX);calculateCoefficients(y0, y1, y2, y3, aY, bY, cY);// 找到导数为零的参数值std::vector<double> xSolutions = solveQuadratic(aX, bX, cX);std::vector<double> ySolutions = solveQuadratic(aY, bY, cY);// 存储边界框的点std::vector<Point> bboxPoints;bboxPoints.push_back(Point(x0, y0));bboxPoints.push_back(Point(x3, y3));// 在导数为零的参数值下计算曲线上的点for (double t : xSolutions) {double x = bezierSpline(x0, x1, x2, x3, t);double y = bezierSpline(y0, y1, y2, y3, t);bboxPoints.push_back(Point(x, y));}for (double t : ySolutions) {double x = bezierSpline(x0, x1, x2, x3, t);double y = bezierSpline(y0, y1, y2, y3, t);bboxPoints.push_back(Point(x, y));}// 计算边界框的坐标double minX = bboxPoints[0].x;double minY = bboxPoints[0].y;double maxX = bboxPoints[0].x;double maxY = bboxPoints[0].y;for (const Point &point : bboxPoints) {minX = std::min(minX, point.x);minY = std::min(minY, point.y);maxX = std::max(maxX, point.x);maxY = std::max(maxY, point.y);}// 创建边界框并返回return BoundingBox(minX, minY, maxX - minX, maxY - minY);
}int main()
{// 定义四个控制点的坐标// double x0 = 300.0, y0 = 400.0, x1 = 400.0, y1 = 300.0, x2 = 700.0, y2 = 500.0, x3 = 500.0, y3 = 500.0;double x0 = 300.0, y0 = 400.0, x1 = 400.0, y1 = 600.0, x2 = 700.0, y2 = 500.0, x3 = 500.0, y3 = 500.0;// 计算贝塞尔曲线的边界框BoundingBox bounds = getBoundsOfCurve(x0, y0, x1, y1, x2, y2, x3, y3);std::cout << "Bounding Box: (" << bounds.x << ", " << bounds.y << ") - Width: " << bounds.width << ", Height: " << bounds.height;return 0;
}// Bounding Box: (300, 400) - Width: 267.277, Height: 125
相关文章:

贝塞尔曲线的一些资料收集
一本免费的在线书籍,供你在非常需要了解如何处理贝塞尔相关的事情。 https://pomax.github.io/bezierinfo/zh-CN/index.html An algorithm to find bounding box of closed bezier curves? - Stack Overflow https://stackoverflow.com/questions/2587751/an-algo…...

计算机网络原理 运输层
一,运输层协议概述 1,进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最底层。当网络边缘部分的两台主机使用网络核心部分的功能进行…...

【JavaEE】多线程案例-阻塞队列
1. 前言 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是: 在队列为空时,获取元素的线程会等待队列变为非空当队列满时,存储元素的线程会等待队列可用 阻塞队列常用于生产者和消费者的场…...

【物联网】简要介绍最小二乘法—C语言实现
最小二乘法是一种常用的数学方法,用于拟合数据和寻找最佳拟合曲线。它的目标是找到一个函数,使其在数据点上的误差平方和最小化。 文章目录 基本原理最小二乘法的求解应用举例使用C语言实现最小二乘法总结 基本原理 假设我们有一组数据点 ( x 1 , y 1 …...

慢查询SQL如何优化
一.什么是慢SQL? 慢SQL指的是Mysql中执行比较慢的SQL,排查慢SQL最常用的方法是通过慢查询日志来查找慢SQL。Mysql的慢查询日志是Mysql提供的一种日志记录,它用来记录Mysql中响应时间超过long_query_time值的sql,long_query_time的默认时间为10s. 二.查看慢SQL是否…...
UART 通信-使用VIO进行板级验证
串口系列知识分享: (1)串口通信实现-串口发送 (2)串口通信发送多字节数据 (3)串口通信实现-串口接收 (4)UART 通信-使用VIO进行板级验证 (5)串口接收-控制LED闪烁 (6)使用串口发送实现ACX720开发板时钟显示 (7)串口发送+RAM+VGA传图 文章目录 前言一、uart串口协…...
linux 查看可支持的shell
查看可支持的shell linux中支持多种shell类型,所以在shell文件的第一行需要指定所使用的shell #!/bin/bash 指定该脚本使用的是/bin/bash,这样的机制使得我们可以轻松地引用任何的解释器 查看该linux系统支持的shell cat /etc/shells/bin/sh/bin/bash/us…...

微服务简介
微服务简介 微服务架构是一种软件架构模式,它将一个大型应用程序拆分为一组小型、独立的服务,每个服务都有自己的业务逻辑和数据存储。这些服务可以独立开发、部署和扩展,通常使用HTTP或其他轻量级通信协议进行通信。 以下是微服务架构的一…...

PHP自己的框架2.0设置常量并绑定容器(重构篇三)
目录 1、设置常量并绑定容器 2、容器增加设置当前容器的实例和绑定一个类实例当容器 3、将常量绑定到容器中 4、运行效果 1、设置常量并绑定容器 2、容器增加设置当前容器的实例和绑定一个类实例当容器 //设置当前容器的实例public static function setInstance($instance){…...

重建大师提交空三后引擎状态是等待,怎么开启?
答:图片中这是在自由网空三阶段,整个AT都是等待中,可以修改任务目录和监控目录看一下,先设置引擎,再提交空三。...

【数据结构】堆的向上调整和向下调整以及相关方法
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 文章目录 一、堆的概念二、堆的性质…...

【蓝桥杯选拔赛真题60】Scratch旋转风车 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析
目录 scratch旋转风车 一、题目要求 编程实现 二、案例分析 1、角色分析...

JavaSE、JavaEE与Spring的概念和异同点剖析以及规范13 个分析
JavaSE、JavaEE与Spring的概念和异同点剖析以及规范13 个分析 目录概述需求: 设计思路实现思路分析1.什么是JavaSE2.是JavaEE3.什么是Spring 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&…...

微信小程序的图书馆图书借阅 座位预约系统 读者端设计与实现
该系统基于B/S即所谓浏览器/服务器模式,应用springboot框架,选择MySQL作为后台数据库。系统主要包括系统图书信息、图书借阅、图书归还、自习室信息、自习室预约等功能模块。 关键词 微信小程序的图书馆读者端;微信小程序;java语…...

在阿里云 linux 服务器上查看当前服务器的Nginx配置信息
我们可以通过命令 sudo nginx -t查看到nginx.conf的路径 可以通过 sudo nginx -T查看 nginx 详细配置信息,包括加载的配置文件和配置块的内容 其中也会包括配置文件的内容...

专业招投标书翻译怎样做比较好
在全球经济贸易一体化不断深入的时代,招投标作为国际通用的新型贸易方式,受到了大量中外企业的青睐。根据国际惯例,与招标采购活动有关的一切文件资料,均须使用英文编制。即使允许使用非英文语言编制,也必须随附一份英…...

算法总结10 线段树
算法总结10 线段树 线段树2569. 更新数组后处理求和查询 线段树 有一个数组,我们要: 更新数组的值(例如:都加上一个数,把子数组内的元素取反)查询一个子数组的值(例如:求和&#x…...

518抽奖软件,支持按人像照片抽奖
518抽奖软件简介 518抽奖软件,518我要发,超好用的年会抽奖软件,简约设计风格。 包含文字号码抽奖、照片抽奖两种模式,支持姓名抽奖、号码抽奖、数字抽奖、照片抽奖。(www.518cj.net) 照片抽奖模式 圆角边框 照片抽奖模式下&am…...

数字IC笔试面试题之--时钟偏斜(skew)与抖动(jitter)
1 时钟偏斜(clock skew) 时钟偏斜(偏移)是因为布线长度和负载不同,导致同一时钟上升沿到不同触发器的时间不同。这一时间差,即为时钟偏移。 时钟偏斜可能导致时序违例(本文直接粘贴了参考博客…...
免费api接口:物流api,企业工商查询api,游戏api。。。
免费api接口,物流api,企业工商查询api,游戏api。。。都有。 Facebook Games Services - Facebook Games Services 为游戏开发者提供了各种服务, 包括(但不限于) 成就 API, 分数 API, 应用通知, 请求, 游戏养成和 Facebook SDK for Unity.Google Play Games Service…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...