C#实现贝塞尔曲线的算法
贝塞尔曲线
- 原理
- 代码
- 呈现
原理
首先,关于贝塞尔曲线的形成原理网上有很多详解文章。
这里给大家推荐几篇文章的连接作为参考:
- https://www.cnblogs.com/jay-dong/archive/2012/09/26/2704188.html
- https://blog.csdn.net/xiexian1204/article/details/49592765
- https://pages.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/de-casteljau.html
比起文字,我觉得下面的一幅动态图更能将其原理准确的表现出来:
上图是4个锚点的动图,而除了4个的还可以有更多的锚点,但原理都是一样的。如图:
其实,锚点的个数只要大于等于3个的情况下便可以画出一条贝塞尔曲线。
代码
先根据动图中4个锚点的情况,简单的写一个贝塞尔的逻辑:
public List<Transform> gameOjbet_tran = new List<Transform>();
private List<Vector3> point = new List<Vector3>();
void Init()
{point = new List<Vector3>();for (int i = 0; i < 200; i++){//一Vector3 pos1 = Vector3.Lerp(gameOjbet_tran[0].position, gameOjbet_tran[1].position, i / 100f);Vector3 pos2 = Vector3.Lerp(gameOjbet_tran[1].position, gameOjbet_tran[2].position, i / 100f);Vector3 pos3 = Vector3.Lerp(gameOjbet_tran[2].position, gameOjbet_tran[3].position, i / 100f);//二var pos1_0 = Vector3.Lerp(pos1, pos2, i / 100f);//三Vector3 find = Vector3.Lerp(pos1_0, pos1_1, i / 100f);point.Add(find);}
}
我是在Unity3D的环境中编写的,之中的Vector3.Lerp
是一个求差值的函数,求两点之间一定比例的差值,第一个参数为第一个点(起始点)、第二个参数为第二个点(结束点)、第三个参数为要求的比例。
上面是4个锚点时的基本逻辑,那如果锚点的个数有更多个或只有最少的3个时,我们就要根据其重新写一个吗?当然不用,我通过其形成原理,整合并简化了一个算法,可以适用于任何数量锚点的贝塞尔虚线。
public List<Transform> anchor = new List<Transform>();
private List<Vector3> point = new List<Vector3>();
//计算出指定个点,将他们练成一条直线,使其开起来像是曲线
void GetPathPoints()
{Vector3[] temp_1 = new Vector3[anchor.Count];for (int i = 0; i < temp_1.Length; i++){//获取锚点坐标temp_1[i] = anchor[i].position;}point = new List<Vector3>();//最终贝塞尔曲线上点的链表集合float pointNumber = 50;//贝塞尔曲线上点的数量Vector3[] temp_2;Vector3[] temp_3;for (int i = 0; i <= (int)pointNumber; i++){temp_3 = temp_1;for (int j = temp_3.Length - 1; j > 0; j--){temp_2 = new Vector3[j];for (int k = 0; k < j; k++){temp_2[k] = Vector3.Lerp(temp_3[k], temp_3[k + 1], i / pointNumber);}temp_3 = temp_2;}Vector3 find = temp_3[0];point.Add(find);}
}
呈现
这里我用的Unity3D物理引擎作为呈现的环境:
void OnDrawGizmos()
{GetPathPoints();Gizmos.color = Color.yellow;for (int i = 0; i < point.Count - 1; i++){Gizmos.DrawLine(point[i], point[i + 1]);}
}
效果:
C#实现贝塞尔曲线的算法相关推荐
- 有理贝塞尔曲线(Rational Bezier Curves)
有理贝塞尔曲线(Rational B′ezier Curves) 1.定义 有理贝塞尔曲线(Rational B′ezier Curves) 控制点为 b0,⋯,bnb_0,\cdots,b_n 的n ...
- 前端动画之贝塞尔曲线推导及应用
hello,大家好,今天豆皮范儿给大家带来了贝塞尔曲线推导和应用,优美的贝塞尔曲线想起了大学时候老师在给我们讲如何实现,如何推导,如何实现和应用.本来也来详细介绍一下,纯纯的干货- 作者:lff 生活 ...
- 【CAD算法】【计算机图形学】Bezier贝塞尔曲线生成程序(python/numpy实现)[1]
整个项目,从Bezier曲线的创建,到Coons Patch曲面的实现,再到网格的实现和优化,还有最后对表面的光顺,链接如下: [CAD算法][计算机图形学]Bezier贝塞尔曲线生成程序(pytho ...
- 【路径规划】局部路径规划算法——贝塞尔曲线法(含python实现 | c++实现)
文章目录 参考资料 1. 算法简介 2. 公式原理及python实现 2.1 一阶贝塞尔曲线 2.2 二阶贝塞尔曲线 2.3 三阶贝塞尔曲线 2.4 n阶贝塞尔曲线 2.5 贝塞尔曲线性质 3. c+ ...
- 贝塞尔曲线算法之JS获取点
什么是贝塞尔曲线? 贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线. 这个一阶贝塞尔曲线绘制过程,黑点按百分比t从P0->P1移动,看不出什 ...
- 【Android UI】贝塞尔曲线 ⑦ ( 使用 德卡斯特里奥算法 公式计算的 方法绘制三阶贝塞尔曲线示例 )
文章目录 一.使用 德卡斯特里奥算法 公式计算的 方法绘制三阶贝塞尔曲线 二.代码示例 贝塞尔曲线参考 : https://github.com/venshine/BezierMaker 一.使用 德 ...
- 贝塞尔曲线N阶实现-德卡斯特里奥算法(De Casteljau’s Algorithm)
贝塞尔曲线很多客户端已经自行集成,安卓ios或是web,今天基于算法动手实现一次,今天只放源码,暂时不做说明了(还要加班,--~),源码在下面,直接看也能看懂 德卡斯特里奥算法的基础就是在向量AB上选 ...
- 德卡斯特里奥算法(De Casteljau’s Algorithm)绘制贝塞尔曲线
原文:http://blog.csdn.net/Fioman/article/details/2578895 德卡斯特里奥算法可以计算贝塞尔曲线上的点C(u),u∈[0,1].因此,通过给定一组u的值 ...
- 基于三阶贝塞尔曲线的数据平滑算法
文章目录 前言 贝塞尔曲线 算法描述 算法实现 参考资料 前言 很多文章在谈及曲线平滑的时候,习惯使用拟合的概念,我认为这是不恰当的.平滑后的曲线,一定经过原始的数据点,而拟合曲线,则不一定要经过原始 ...
最新文章
- #113. 【UER #2】手机的生产
- 智能指针_auto_ptr2_学习笔记
- 苹果6s解除耳机模式_出大问题!苹果或将砍掉3D Touch?
- 评估 | 自动摘要评估
- 讲讲Linq to SQL映射(基础篇)
- saltstack-部署
- ZeroMQ--使用jzmq进行编程
- PHP快速获取MySQL数据库表结构
- 【leetcode❤python】Intersection of Two Arrays
- android screencap,android – “adb screencap /sdcard/screenshot.raw”生成什么格式? (没有“-p”标志)...
- Mongo连接可视化工具Robo3T,以及Robo3T使用
- 2021年北京邮电大学计算机12组(原网研二组)夏令营面试经历
- c语言无法定位程序输入点 于动态链接库,无法定位程序输入点 于动态链接库怎么办...
- 编译DPC++ Compiler(支持Nvidia显卡)
- 随记:spri排除Bean时not be excluded because they are not auto-configuration classes
- html生成海报图片
- 二级导航栏(html、css)
- SQL高级语句(二)
- 如何在英文版本的win7中安装中文软件?
- HTTP请求方式和报文解析