贝塞尔曲线

  • 原理
  • 代码
  • 呈现

原理

首先,关于贝塞尔曲线的形成原理网上有很多详解文章。

这里给大家推荐几篇文章的连接作为参考:

  1. https://www.cnblogs.com/jay-dong/archive/2012/09/26/2704188.html
  2. https://blog.csdn.net/xiexian1204/article/details/49592765
  3. 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#实现贝塞尔曲线的算法相关推荐

  1. 有理贝塞尔曲线(Rational Bezier Curves)

    有理贝塞尔曲线(Rational B′ezier Curves) 1.定义 有理贝塞尔曲线(Rational B′ezier Curves) 控制点为 b0,⋯,bnb_0,\cdots,b_n 的n ...

  2. 前端动画之贝塞尔曲线推导及应用

    hello,大家好,今天豆皮范儿给大家带来了贝塞尔曲线推导和应用,优美的贝塞尔曲线想起了大学时候老师在给我们讲如何实现,如何推导,如何实现和应用.本来也来详细介绍一下,纯纯的干货- 作者:lff 生活 ...

  3. 【CAD算法】【计算机图形学】Bezier贝塞尔曲线生成程序(python/numpy实现)[1]

    整个项目,从Bezier曲线的创建,到Coons Patch曲面的实现,再到网格的实现和优化,还有最后对表面的光顺,链接如下: [CAD算法][计算机图形学]Bezier贝塞尔曲线生成程序(pytho ...

  4. 【路径规划】局部路径规划算法——贝塞尔曲线法(含python实现 | c++实现)

    文章目录 参考资料 1. 算法简介 2. 公式原理及python实现 2.1 一阶贝塞尔曲线 2.2 二阶贝塞尔曲线 2.3 三阶贝塞尔曲线 2.4 n阶贝塞尔曲线 2.5 贝塞尔曲线性质 3. c+ ...

  5. 贝塞尔曲线算法之JS获取点

    什么是贝塞尔曲线? 贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线. 这个一阶贝塞尔曲线绘制过程,黑点按百分比t从P0->P1移动,看不出什 ...

  6. 【Android UI】贝塞尔曲线 ⑦ ( 使用 德卡斯特里奥算法 公式计算的 方法绘制三阶贝塞尔曲线示例 )

    文章目录 一.使用 德卡斯特里奥算法 公式计算的 方法绘制三阶贝塞尔曲线 二.代码示例 贝塞尔曲线参考 : https://github.com/venshine/BezierMaker 一.使用 德 ...

  7. 贝塞尔曲线N阶实现-德卡斯特里奥算法(De Casteljau’s Algorithm)

    贝塞尔曲线很多客户端已经自行集成,安卓ios或是web,今天基于算法动手实现一次,今天只放源码,暂时不做说明了(还要加班,--~),源码在下面,直接看也能看懂 德卡斯特里奥算法的基础就是在向量AB上选 ...

  8. 德卡斯特里奥算法(De Casteljau’s Algorithm)绘制贝塞尔曲线

    原文:http://blog.csdn.net/Fioman/article/details/2578895 德卡斯特里奥算法可以计算贝塞尔曲线上的点C(u),u∈[0,1].因此,通过给定一组u的值 ...

  9. 基于三阶贝塞尔曲线的数据平滑算法

    文章目录 前言 贝塞尔曲线 算法描述 算法实现 参考资料 前言 很多文章在谈及曲线平滑的时候,习惯使用拟合的概念,我认为这是不恰当的.平滑后的曲线,一定经过原始的数据点,而拟合曲线,则不一定要经过原始 ...

最新文章

  1. #113. 【UER #2】手机的生产
  2. 智能指针_auto_ptr2_学习笔记
  3. 苹果6s解除耳机模式_出大问题!苹果或将砍掉3D Touch?
  4. 评估 | 自动摘要评估
  5. 讲讲Linq to SQL映射(基础篇)
  6. saltstack-部署
  7. ZeroMQ--使用jzmq进行编程
  8. PHP快速获取MySQL数据库表结构
  9. 【leetcode❤python】Intersection of Two Arrays
  10. android screencap,android – “adb screencap /sdcard/screenshot.raw”生成什么格式? (没有“-p”标志)...
  11. Mongo连接可视化工具Robo3T,以及Robo3T使用
  12. 2021年北京邮电大学计算机12组(原网研二组)夏令营面试经历
  13. c语言无法定位程序输入点 于动态链接库,无法定位程序输入点 于动态链接库怎么办...
  14. 编译DPC++ Compiler(支持Nvidia显卡)
  15. 随记:spri排除Bean时not be excluded because they are not auto-configuration classes
  16. html生成海报图片
  17. 二级导航栏(html、css)
  18. SQL高级语句(二)
  19. 如何在英文版本的win7中安装中文软件?
  20. HTTP请求方式和报文解析

热门文章

  1. 幻数java题_java – 公式中的幻数
  2. 让电脑死机c语言,秘技:如何悄无声息的让一台电脑死机
  3. windows不安装虚拟机如何使用Linux系统作为开发工具?
  4. android设置头像同时设置模糊背景
  5. 使用 Wrapper 自定义SQL
  6. 淘淘商城业务--加油
  7. 如何把汉字转成五笔与拼音(首字母或全部字母)
  8. windows之在局域网内共享和共同编辑EXCEL
  9. 《Hud 2589》Phalanx详解
  10. 使用高匿代理访问西刺代理(假如ip被封可用高匿ip访问网站)