贝塞尔曲线的一些资料收集

一本免费的在线书籍,供你在非常需要了解如何处理贝塞尔相关的事情。
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…...
终极指南:如何用HS2-HF Patch轻松实现Honey Select 2中文本地化
终极指南:如何用HS2-HF Patch轻松实现Honey Select 2中文本地化 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为看不懂Honey Select 2的日文界…...
Verilog specify语法实战:如何用5分钟搞定模块路径延时配置(附常见坑点)
Verilog specify语法实战:5分钟掌握模块路径延时配置与避坑指南 在数字电路设计中,精确控制信号传播延迟是确保时序收敛的关键环节。作为硬件描述语言的核心特性之一,Verilog的specify块提供了一种声明式方法来定义模块引脚间的路径延迟&…...
别再只用箱线图了!用Python的PtitPrince库5分钟搞定雨云图,数据分布一目了然
数据可视化新选择:用PtitPrince打造专业级雨云图 在数据分析的世界里,可视化工具的选择往往决定了我们能否准确传达数据背后的故事。传统箱线图虽然简洁,却隐藏了太多细节;提琴图展示了分布形态,却丢失了原始数据点。这…...
深度学习计算机视觉:从原理到实践
深度学习计算机视觉:从原理到实践 1. 背景与动机 计算机视觉是深度学习最成功的应用领域之一。从图像分类到目标检测,从语义分割到图像生成,深度学习技术已广泛应用于自动驾驶、医疗影像、工业检测等领域。本文将介绍计算机视觉的核心技术和实…...
芯片可靠性测试避坑指南:为什么你的FCBGA封装必须做BHast(附硬件制备全流程)
芯片可靠性测试避坑指南:为什么你的FCBGA封装必须做BHast(附硬件制备全流程) 在芯片可靠性测试领域,BHast(Highly Accelerated Temperature and Humidity Stress Test)是一个经常被讨论却又容易被误解的测试…...
Hain性能优化终极教程:10个技巧让你的启动器运行更快更稳定
Hain性能优化终极教程:10个技巧让你的启动器运行更快更稳定 【免费下载链接】hain An altspace launcher for Windows, built with Electron 项目地址: https://gitcode.com/gh_mirrors/ha/hain 想要让你的Hain启动器运行如飞吗?作为一款基于Elec…...
nix-installer多平台部署实战:Linux、macOS、WSL全攻略
nix-installer多平台部署实战:Linux、macOS、WSL全攻略 【免费下载链接】nix-installer Install Nix and flakes with the fast and reliable Determinate Nix Installer, with over a million installs. 项目地址: https://gitcode.com/gh_mirrors/ni/nix-instal…...
GLM-4-9B-Chat-1M实战:vLLM部署教程+Chainlit前端搭建,一步到位
GLM-4-9B-Chat-1M实战:vLLM部署教程Chainlit前端搭建,一步到位 1. 项目概述 GLM-4-9B-Chat-1M是智谱AI推出的新一代预训练模型,支持高达1M(约200万中文字符)的上下文长度。本教程将带您完成从模型部署到前端搭建的完…...
突破Windows权限限制:TrustedInstaller提权工具完全指南
突破Windows权限限制:TrustedInstaller提权工具完全指南 【免费下载链接】LeanAndMean snippets for power users 项目地址: https://gitcode.com/gh_mirrors/le/LeanAndMean 作为系统管理员或高级用户,你是否曾因"拒绝访问"而无法修改…...
最全|OpenClaw 2026年阿里云部署方法,小白7分钟掌握
最全|OpenClaw 2026年阿里云部署方法,小白7分钟掌握。本文面向零基础用户,完整说明在轻量服务器与本地Windows11、macOS、Linux系统中部署OpenClaw(Clawdbot)的流程,包含环境配置、服务启动、Skills集成、阿…...
