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

贝塞尔曲线
一本免费的在线书籍,供你在非常需要了解如何处理贝塞尔相关的事情。
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

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

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

相关文章

歌曲推荐《最佳损友》

最佳损友 陈奕迅演唱歌曲 《最佳损友》是陈奕迅演唱的一首粤语歌曲&#xff0c;由黄伟文作词&#xff0c;Eric Kwok&#xff08;郭伟亮&#xff09;作曲。收录于专辑《Life Continues》中&#xff0c;发行于2006年6月15日。 2006年12月26日&#xff0c;该曲获得2006香港新城…

Python之OS模块

os模块负责程序与操作系统的交互&#xff0c;提供了访问操作系统底层的接口;即os模块提供了非常丰富的方法用来处理文件和目录。 使用的时候需要导入该模块:import os

MojoTween:使用「Burst、Jobs、Collections、Mathematics」优化实现的Unity顶级「Tween动画引擎」

MojoTween是一个令人惊叹的Tween动画引擎&#xff0c;针对C#和Unity进行了高度优化&#xff0c;使用了Burst、Jobs、Collections、Mathematics等新技术编码。 MojoTween提供了一套完整的解决方案&#xff0c;将Tween动画应用于Unity Objects的各个方面&#xff0c;并可以通过E…

HCIP学习-IPv6

目录 前置学习内容 IPv6解决的一些IPv4的缺陷 无限的地址 层次化的地址结构 即插即用 简化报文头部 IPv4和IPv6报头比较 端到端的网络罗完整性 安全性增强 挣钱QoS特性 IPv6地址介绍 格式 首选格式 压缩格式 内嵌IPv4地址格式的IPv6地址格式 IPv6的网络前缀和接…

MySQL——数据的增删改

2023.9.12 本章开始学习DML (数据操纵语言) 语言。相关学习笔记如下&#xff1a; #DML语言 /* 数据操作语言&#xff1a; 插入&#xff1a;insert 修改&#xff1a;update 删除&#xff1a;delete */#一、插入语句 #方式一&#xff1a;经典的插入 /* 语法&#xff1a; insert …

python协程学习

import asyncio import time import csv import queue import aiosqlite import timeconn None # 定义一个队列&#xff0c;用于传递数据 data_queue queue.Queue()# 启动写文件 # def callback(): # await # print(f"执行结果:{future.result()}") async…

后端入门教程:从零开始学习后端开发

1. 编程基础 首先&#xff0c;作为一名后端开发者&#xff0c;你需要掌握至少一门编程语言。Python是一个很好的选择&#xff0c;因为它易于学习且功能强大。让我们从一个简单的示例开始&#xff0c;在控制台输出 "Hello, World!"。 2. 学习Web基础 了解Web开发基…

图的学习,深度和广度遍历

一、什么是图 表示“多对多”的关系 包括&#xff1a; 一组顶点&#xff1a;通常用V&#xff08;Vertex&#xff09;表示顶点集合一组边&#xff1a;通常用E&#xff08;Edge&#xff09;表示边的集合 边是顶点对&#xff1a;(v, w)∈E&#xff0c;其中v,w∈V有向边<v, w&…

通过软件读取ESP8266/ESP32的MAC地址

具体MAC地址可以学习相关书籍、网络、课程和网页等 这里只是给出代码作为本专栏完整性的一部分内容 作为嵌入式软件工程师来说 我只要把我的软件做得尽可能好就可以了 相关理论知识确实不想花太多时间研究&#xff0c;只是作为工程人员拿来使用&#xff0c;熟练掌握原理就可…

蓝牙 - 什么是Man-in-the-middle protection

中间人&#xff08;MITM&#xff09;攻击发生在当用户想要连接两台设备时&#xff0c;使得他们并没有直接连接对方&#xff0c;而是在不知情的情况下连接到了第三台&#xff08;攻击&#xff09;设备&#xff0c;该设备扮演了他们试图配对的设备的角色。第三台设备随后会在两台…

Swoole 介绍以及 编译安装

Swoole是什么&#xff1f; Swoole是一个PHP语言的开源异步网络通信引擎&#xff0c;它是以PHP语言为基础&#xff0c;以C语言编写的扩展。它可以让PHP语言程序拥有异步网络通信能力&#xff0c;并且能够支持高并发、高性能的TCP/UDP/Unix Socket/HTTP服务器。 Swoole的优势 …

最新遥感数据与作物模型同化教程

详情点击公众号链接&#xff1a;最新遥感数据与作物模型同化教程一&#xff1a;遥感基础1.遥感平台&#xff08;如无人机&#xff09;与传感器、国内外主要陆地卫星&#xff08;如Landsat、SPOT、HJ、GF&#xff09; 2.遥感基本原理、光谱响应函数、遥感数据处理流程 3.遥感在陆…

多寄存器内存访问指令的寻址方式

多寄存器内存访问 注意使用的是大括号 将R1-R4寄存器中的数据存储到内存以R11为起始地址的内存中 LDM同样适用 当寄存器不连续时&#xff0c;使用逗号分隔 例 STM R11,{R1,R2,R4} 不管寄存器列表中寄存器的顺序如何&#xff0c;存到内存中永远都是小编号的寄存…

Java程序员学习算法路线规划总结

文章目录 前言&#xff1a;必须清楚得基本数据结构&#xff1a;1.需掌握哪些算法&#xff1f;2.学习步骤以及路线 前言&#xff1a;必须清楚得基本数据结构&#xff1a; 数组&#xff08;Array&#xff09; 链表&#xff08;Linked List&#xff09; 栈&#xff08;Stack&…

MyBatis: 分页插件PageHelper直接传递分页参数的用法

一、加分页插件依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.13</version></dependency>二、配置分页插件&#xff0c;并配置相关属性&a…

php权限调整强制用户退出的解决方案

要强制用户重新登录&#xff0c;你可以采取以下步骤&#xff1a; 当用户登录时&#xff0c;将用户的登录状态和其他相关信息存储在服务器端。例如&#xff0c;你可以将用户ID、用户名或其他标识符存储在服务器的会话&#xff08;session&#xff09;中。当管理员修改用户的某些…

【再识C进阶2(中)】详细介绍指针的进阶——函数指针数组、回调函数、qsort函数

前言 &#x1f493;作者简介&#xff1a; 加油&#xff0c;旭杏&#xff0c;目前大二&#xff0c;正在学习C&#xff0c;数据结构等&#x1f440; &#x1f493;作者主页&#xff1a;加油&#xff0c;旭杏的主页&#x1f440; ⏩本文收录在&#xff1a;再识C进阶的专栏&#x1…

一些工具类

1、字符串处理工具类 1.1、StrUtils package com.study.java8.util;/*** Classname&#xff1a;StrUtils* Description&#xff1a;字符串工具类* Date&#xff1a;2023/9/9 9:37* Author&#xff1a;jsz15*/import org.apache.commons.lang.text.StrBuilder; import org.apa…

Unity之创建第一个2D游戏项目

一 Unity环境配置 1.1 Untity资源官网下载&#xff1a;https://unity.cn/releases 1.2 Unity Hub集成环境&#xff0c;包含工具和项目的管理 1.3 Unity Editor编辑器 1.4 Visual Studio 2022脚本编辑器 1.5 AndroidSKD&#xff0c;JDK&#xff0c;NDK工具&#xff0c;用于and…

分享一个基于微信小程序开发的高校学生毕业设计选题小程序的源码 lw 调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…