一、概述

Berzier curve是应用于二维图形应用程序的数学曲线。曲线定义:起始点、终止点(也称锚点)、控制点。通过调整控制点,贝塞尔曲线的形状会发生变化。1962年,法国数学家Pierre Bezier第一个研究出了这种矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就被命名为贝塞尔曲线。

二、拟合原理

①在平面内选3个不在同一条直线的点A、B、C并且依次用线段连接。如下所示:

②在AB和BC上分别确定点D和点E,使得AD/AB = BE/BC成立:

③连接DE,并在DE上找出一点F,使得DF/DE = AD/AB = BE/BC

④、让选取的点D在第一条线段上从起点A,移动到终点B,并始终满足DF/DE=AD/AB=BE/BC成立。找出所有点F,并将它们连起来。会得到一条非常光滑的曲线,即贝塞尔曲线。具体可观看如下的动图加深理解。

三、简单推导(以三阶为例)

设P0、P02、P2是一条抛物线上三个顺序不同的点。过P0和P2点的两切线交于P1点,在P02点的切线交P0P1和P2P1于P01和P11,则如下比例成立:

这也就是所谓的三切线定理:

当P0,P2固定,引入参数t,令上述比值为 t:(1-t) 则有:

当t从0变化到1时,上面的①和②就表示的是边P0P1和边P1P2,这是两条一次Bezier曲线,将①②代入③,得到:

上式中的t从0变到1时,表示了由顶点P0、P1、P2三点定义的一条二次Bezier曲线。并且表明:这个二次贝塞尔曲线P02可以定义为分别由前两个顶点(P0,P1)和后两个顶点(P1,P2)决定的一次贝塞尔曲线的线性组合。
        依次类推,由4个控制点定义的三次贝塞尔曲线P03可被定义为分别由(P0,P1,P2)和(P1,P2,P3)确定的二条二次贝塞尔曲线的线性组合,由(n+1)个控制点Pi(i=0,1,…,n)定义的n次Bezier曲线P0n可被定义为分别由前、后n个控制点定义的两条(n-1)次Bezier曲线P0n-1与P1n-1的线性组合:

由此得到Bezier曲线的递推计算公式:

四、使用贝塞尔曲线画一个爱心

注:该案例是网上的找的,放在这里只是为了方便大家理解与学习贝塞尔曲线。仅供学习使用,如有侵权请私信我。
1、先看一下实现效果:

2、源代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>爱心</title>
</head>
<body>
<canvas id="canvas" style="border: 1px solid #aaa;display: block;margin: 50px auto;"></canvas>
</div></body>
<script>window.onload = function () {var canvas = document.getElementById("canvas");//获取画布var ctx = canvas.getContext('2d');//获取图形上下文,并指明绘制的环境类型为2dcanvas.width = 800;//设置画布的宽canvas.height = 800;//设置画布的高drawHeart(ctx,400,400,50,30);//画心}function drawHeart(ctx,x,y,R,rot) {ctx.save();//ctx.translate(x,y);//绘制平移效果的图形ctx.rotate(rot/180*Math.PI);//设置图形的旋转角度ctx.scale(R, R);//设置图形的大小,即使用scale()方法进行缩放。heartPath(ctx);/*ctx.strokeStyle = "red";ctx.lineWidth = "3px";*/ctx.fillStyle = "red";//使用红色填充ctx.shadowColor = "gray";//设置阴影颜色ctx.shadowOffsetX = 5;ctx.shadowOffsetY = 5;ctx.shadowBlur = 5;ctx.fill();//ctx.stroke();ctx.restore();}function heartPath(ctx) {ctx.beginPath();//使用arc()函数画圆ctx.arc(-1,0,1,Math.PI,0,false);ctx.arc(1,0,1,Math.PI,0,false);//貝塞尔曲线画心ctx.bezierCurveTo(1.9, 1.2, 0.6, 1.6, 0, 3.0);ctx.bezierCurveTo( -0.6, 1.6,-1.9, 1.2,-2,0);ctx.closePath();}
</script></html>

来自程序猿的爱心表白——贝塞尔曲线讲解及实例相关推荐

  1. HTML5纯css实现爱心动画效果DW、vscode来自程序员的浪漫表白

    HTML5纯css实现爱心动画效果DW来自程序员的浪漫表白 一.拉面版 css部分 *{/* 初始化页面元素内外边距*/margin:0;padding: 0;}body{/* 弹性布局元素垂直水平居 ...

  2. 中国好同事!帮程序猿跟姑娘表白,他们组了一支乐队

    阿里有个团队,组团在内网上吼了一曲HipHop,据说,还帮程序猿表白了姑娘. 下面请欣赏,黑怕神曲--小翔很嘻哈. <小翔很嘻哈>歌词 勾股: Are U Ready 2 be a Fro ...

  3. 爱要大声“手”出来!一个程序猿的七夕表白应用!

    流星落了,那是天哭了:雨水下了,那是思念涨潮了:月亮升了,那是情谊珍藏了:人间的喜鹊飞了,那是七夕就要到了.我们程序猿如何对心爱的那个她表白呢?昨天发现一个好的免费的应用,相当简单.下面给大家分享一下 ...

  4. 收藏!程序猿治愈系表白图来了!

    假如生活欺骗了你,找50个程序员问问为什么编程: 假如生活让你想死,找50个程序员问问BUG改完了没有: 假如你觉得生活拮据,找50个程序员问问工资涨了没有: 假如你觉得活着无聊,找50个程序员问问他 ...

  5. 【HTML】浪漫程序员 HTML5爱心表白动画

    我们程序员在追求爱情方面也是非常浪漫的,下面是一位同学利用自己所学的HTML5知识自制的HTML5爱心表白动画,画面非常温馨甜蜜,这样的创意很容易打动女孩,如果你是单身的程序员,也赶紧来制作自己的爱心 ...

  6. 第十五周——程序猿的深情表白

    /*Univercity:烟台大学 *@Class</A>计134~4 *@Author:薛富磊 *@Time:2013-12-03 *@Function: 杨辉三角赋值 输出 *@Arg ...

  7. android 详解画图,android画图之贝塞尔曲线讲解详解

    首先对于<赛贝尔曲线>不是很了解的童鞋,请自觉白度百科.google等等... 为了方便偷懒的童鞋,这里给个<贝赛尔曲线>百科地址,以及一段话简述<贝赛尔曲线>: ...

  8. android画图之贝塞尔曲线讲解

    首先对于<赛贝尔曲线>不是很了解的童鞋,请自觉白度百科.google等等... 为了方便偷懒的童鞋,这里给个<贝赛尔曲线>百科地址,以及一段话简述<贝赛尔曲线>: ...

  9. 通俗易懂的贝塞尔曲线讲解(转载)

    最近在看svg相关知识时,看到贝塞尔曲线,之前也知道有这个,但一直不知道它到底是个什么东西(大学好像学过,但已经还给老师了) 在网上找到一篇一看就懂的讲解 在Android开发和面试中(尤其是一些中高 ...

最新文章

  1. Linux之软件卸载 apt-get
  2. 熵的定义(很好的方法论工具尤其第三熵增益的计算)
  3. CentOS 安装Nginx
  4. 为工厂分配用于公司间Invoice的销售范围
  5. c语言is stack empty,C语言实现栈的问题
  6. 提交不了_从来没有借过钱!征信空白,为什么办不了信用卡?
  7. java 监听客户端的退出_Java ServerSocket 手动关闭监听
  8. 关于DateTime的一点记录 ToString(yyyy-MM-dd HH:mm:ss)
  9. VS Code的golang开发配置 之 代码提示
  10. php 面向对象问题,PHP 面向对象开发的一些问题
  11. Spring中EmptyResultDataAccessException异常产生的原理及处理方法
  12. Redis----windows下配置和运行
  13. VS2012+SQLServer2008 R2 开发工具
  14. SpringBoot系列(1):Spring和SpringBoot常用注解总结
  15. H3C IRF2的三种配置情况「转载」
  16. 思维方式 | 深入浅出解释“第一性原理”
  17. Red Hat Ubuntu Centos 更改登录横幅
  18. CnOpenData中国小区及二手房交易数据简介
  19. oracle数据库有触发器,Oracle数据库触发器(Triggers)
  20. 45岁以后,外企的人都到去哪里了呢?(转载:岭南一梦)

热门文章

  1. MySQL数据库——字符函数
  2. phpcms V9 常用函数 及 代码整理
  3. 微信小程序页面数据布局
  4. 11.11查缺补漏少一单?戴尔双十一同等优惠最后2天!
  5. 【UE4+Houdini+Bridge】程序化地形生成和野外植被撒点工具制作思路
  6. ios 线程休眠_iOS底层分析 - 线程锁(一)NSLock
  7. 命令行生成并直接运行jar包
  8. codecombat计算机科学入门三(Python)
  9. 男人的痛女人永远不知道!
  10. 华为畅享8plus停产了吗_华为畅享8和Plus有什么区别?华为畅享8 Plus与畅享8全面对比...