贝塞尔曲线的一些资料收集
一本免费的在线书籍,供你在非常需要了解如何处理贝塞尔相关的事情。
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…...
第二十八章 Classes - 引用其他类的方法
文章目录 第二十八章 Classes - 引用其他类的方法引用其他类的方法对当前实例的引用 第二十八章 Classes - 引用其他类的方法 引用其他类的方法 在方法(或例程)中,使用下面的语法来引用其他类中的方法: 要调用类方法并访问其返回值,请使用如下表达式:…...
Android 中集成 TensorFlow Lite图片识别
在上图通过手机的相机拍摄到的物体识别出具体的名称,这个需要通过TensorFlow 训练的模型引用到项目中;以下就是详细地集成 TensorFlow步骤,请按照以下步骤进行操作: 在项目的根目录下的 build.gradle 文件中添加 TensorFlow 的 Ma…...
NSSCTF之Misc篇刷题记录(16)
NSSCTF之Misc篇刷题记录(16) [黑盾杯 2020]encrypt[UTCTF 2020]Spectre[UTCTF 2020]Observe closely NSSCTF平台:https://www.nssctf.cn/ PS:所有FLAG改为NSSCTF [黑盾杯 2020]encrypt UTAxSlUwTkRWRVo3Um1GclpWOWxibU55ZVhCMGFX…...
域名解析--nslookup和dig
dig (Domain Information Groper) dig 是一个功能强大且更灵活的 DNS 查询工具,通常在 Linux 和 macOS 等 Unix-like 操作系统上使用。以下是 dig 的一些常见用法和区别: 查询域名信息 dig example.com这将返回与指定域名相关的 DNS 记录,…...
EXCEL如何把一个单元格内的文本和数字分开?例如:龚龚15565 = 龚龚 15565
使用工具:WPS 举例: EXCEL如何把一个单元格内的文本和数字批量分开?不使用数据分列。 第一步、将第二行数据冻结 第二步、在B1、C1单元格输入需要分开的示例 第三步、点击选中B1单元格,输入快捷键【CTRLE】进行填充。B2单元格也是…...
uniapp抽取组件绑定事件中箭头函数含花括号无法解析
版本: "dcloudio/uni-ui": "^1.4.27", "vue": "> 2.6.14 < 2.7"... 箭头函数后含有花括号的时候, getData就拿不到val参数 , 解决办法就是去除花括号 // 错误代码: <SearchComp change"(val) > { getData({ val …...
猫头虎博主第四期赠书活动:《精通Go语言:(第2版) 》
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
【学习总结】EasyExcel合并同列不同行,表格数据相同的行
实体类 Data HeadRowHeight(50) ContentStyle(horizontalAlignment HorizontalAlignmentEnum.CENTER, verticalAlignment VerticalAlignmentEnum.CENTER, wrapped BooleanEnum.TRUE) public class CriterionDataExportDTO {ColumnWidth(15)ExcelProperty(value "所属…...
Tokenview X-ray功能:深入探索EVM系列浏览器的全新视角
Tokenview作为一家领先的多链区块浏览器,为了进一步优化区块链用户的使用体验,我们推出了X-ray(余额透视)功能。该功能将帮助您深入了解EVM系列浏览器上每个地址的交易过程,以一种直观、简洁的方式呈现地址的进出账情况…...
【洛谷 P1364】医院设置 题解(图论+深度优先搜索)
医院设置 题目描述 设有一棵二叉树,如图: 其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接…...
南宁兴宁区建设局网站/站长网站推广
1基础理论部分 1.1分频 分频,是的,这个概念也很重要。分频是指将一单一频率信号的频率降低为原来的1/N,就叫N分频。实现分频的电路或装置称为“分频器”,如把33MHZ的信号2分频得到16.5MHZ的信号,3分频得到11MHZ的信号&…...
云建站微网站/百度移动
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管 理器或文件系统;一个系统只能有一个计时工具或ID(…...
网站制作网址/市场推广方案和思路
题目大意: 圆环上有10个点,编号为0-9。从0点出发,每次可以逆时针和顺时针走一步,问走n步回到0点共有多少种走法? 这一个动态规划问题,其公式为: dp[i][j] dp[i-1][(j - 1 length) % length]d…...
一线全屋定制10大品牌/长沙seo优化首选
计算机二级是大学中必不可少的一个证下面小编悄悄告诉你们计算机二级考试中的15个技巧//1.修改Office默认打开方式//据本次参加了模拟考试的考生透露,在打开考生文件夹素材做题时候,可能会出现默认打开方式是wps的情况(有些考点有一级WPS科目)。解决办法…...
wordpress 在线考试/个人网站推广
有声读物小程序毕业设计毕设作品开题报告答辩PPT...
免费做店招的网站/搭建一个app平台需要多少钱
目录 主要函数 caffe_cpu_gemm 函数caffe_cpu_gemv 函数caffe_axpy 函数caffe_set 函数caffe_add_scalar 函数caffe_copy 函数caffe_scal 函数caffeine_cup_axpby 函数caffe_add caffe_sub caffe_mul caffe_div 函数caffe_powx caffe_sqr caffe_exp caffe_abs 函数int caffe_rn…...