小球沿贝塞尔二阶曲线的运动

一:贝塞尔曲线是什么

利用三点控制,生成一条平滑的曲线,具体解析看这个贝塞尔曲线扫盲

二:使用canvas绘制小球沿贝塞尔曲线运动

贝塞尔曲线由三个点确定,起始点P0,中间点(控制点)P1,和终点P2。确定三个点之后,用canvas所有的quadraticCurveTo方法绘制二阶贝塞尔曲线,小球的运动路径就出现了。但是小球需要沿着曲线运动,小球的运动是一帧一帧的,每一帧处于不同的点位置,所以需要计算出一定间隔的点坐标集合,然后根据集合,改变小球的位置坐标,从而达到小球沿曲线运动的效果。

1.canvas 绘制贝塞尔二阶曲线

quadraticCurveTo方法是canvas自带的绘制贝塞尔二阶曲线公式,传入控制点和终点,画出曲线

function draw_curve(obj) {
    //绘制2次贝塞尔曲线
    context.beginPath();
    context.moveTo(obj.p0_x,obj.p0_y);/*开始点*/
    context.quadraticCurveTo(obj.p1_x,obj.p1_y,obj.p2_x,obj.p2_y);/*前两个是控制点坐标xy,后两个是结束点坐标xy*/
    context.strokeStyle = "#000";
    context.stroke();
    context.closePath();
}

2.利用贝塞尔二阶曲线公式计算出曲线某点坐标

我们知道了三点,起始点P0,中间点(控制点)P1,和终点P2。

二阶曲线公式为B(t) = (1-t)^2 P0 + 2(1-t)tP1+ t^2P2;

这里的t是从0到0.99的数,可以取间隔0.01递增

当t为0.05时候,曲线上面某点的坐标O(Ox,Oy)的计算为
Ox = (1-t)^2 P0x + 2(1-t)tP1x+ t^2P2x;
Oy = (1-t)^2 P0y + 2(1-t)tP1y+ t^2P2y;

//利用贝塞尔曲线公式计算出曲线上某点坐标
function get_bezier_dot(t,obj){
    var x = (1-t)*(1-t)*obj.p0_x + 2*t*(1-t)*obj.p1_x + t*t*obj.p2_x;
    var y = (1-t)*(1-t)*obj.p0_y + 2*t*(1-t)*obj.p1_y + t*t*obj.p2_y;
    return {x:x,y:y}
}

3.画圆方法,传入位置坐标

function draw_ball(x,y) {
    context.beginPath();
    context.fillStyle = ‘#00E5EE‘;
    context.arc(x, y,30, 0, Math.PI * 2);
    context.fill();
    context.stroke();
    context.closePath();
}

4.每一帧动画动画执行流程draw_frame()

(1)传入t,计算出这个曲线t时刻的点坐标,利用贝塞尔二阶公式get_bezier_dot()
(2)绘制贝塞尔曲线用quadraticCurveTo()
(3)根据(1)得到的坐标点用context.arc()画出此时的圆在canvas上面
(4)可以再画出坐标文字在图上context.fillText(text, x, y);

5.整体运动轨迹流程:

(1)每隔一定时间间隔画一帧的内容setInterval()
(2)清空画布,清空上一帧的画布clearRect()
(3)传入t,计算出坐标O‘,根据O‘的坐标位置画此帧的内容,即上面每帧的动画流程draw_frame()
(4)此时t增加0.01,当t>0.99的时候clearInterval()
(5)运动完成

原文地址:https://www.cnblogs.com/zhishaofei/p/10749665.html

时间: 2024-10-10 13:21:33

小球沿贝塞尔二阶曲线的运动的相关文章

Bezier(贝塞尔)曲线简介

在计算机图形学中,Bezier曲线被广泛用于对平滑的曲线进行建模,对其有适当的了解是必要的.一条Bezier曲线由一系列控制点定义,称为曲线的阶数,由此可知,使用两个控制点()可以定义一条一阶Bezier曲线,三个控制点则是二阶,以此类推. Bezier曲线可以用递归的方式来定义,它是在控制点间反复地进行线性插值得到的参数曲线.一个简单的定义如下: 给定控制点,其定义了阶Bezier曲线 其中 有了这个定义,立即可以给出一个计算Bezier曲线上任意一点坐标的算法(一般来说,t在0到1之间),即

数学图形(1.47)贝塞尔(Bézier)曲线

贝塞尔曲线又称贝兹曲线或贝济埃曲线,是由法国数学家Pierre Bézier所发现,由此为计算机矢量图形学奠定了基础.它的主要意义在于无论是直线或曲线都能在数学上予以描述. 上一节讲的是高次方程曲线,其实贝塞尔曲线就是高次函数曲线.研究贝塞尔曲线的人最初是按照已知曲线参数方程来确定四个点的思路设计出这种矢量曲线绘制法.涕淌为了向大家 介绍贝塞尔曲线的公式,也故意把问题的已知和所求颠倒了一下位置:如果已知一条曲线的参数方程,系数都已知,并且两个方程里都含有一个参数t,它的值介于 0.1之间,表现形

Canvas贝塞尔二级曲线

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>quadraticCurveTo</title> </head> <body> <canvas id='myCanvas' width='200' height='100'> your browser does not s

Canvas贝塞尔三级曲线

两个控制点 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>bezierCurveTo</title> </head> <body> <canvas id='myCanvas' width='400' height='200'> your browser does no

Android 贝塞尔曲线的浅析

博客也开了挺长时间了,一直都没有来写博客,主要原因是自己懒---此篇博客算是给2017年一个好的开始,同时也给2016年画上一个句点,不留遗憾. 那就让我们正式进入今天的主题:贝塞尔曲线. 首先,让我们来了解下什么是贝塞尔曲线. 贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线.贝塞尔曲线于1962,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计.贝塞尔曲线最初由Paul de Cas

iOS 使用贝塞尔曲线绘制路径

使用贝塞尔曲线绘制路径 大多数时候,我们在开发中使用的控件的边框是矩形,或者做一点圆角,是使得矩形的角看起来更加的圆滑. 但是如果我们想要一个不规则的图形怎么办?有人说,叫UI妹子做,不仅省事,还可以趁机接近她们(_:D).这又时候确实可以.但是如果是一个时刻变动的不规则图形,这样如果做成动图或者剪出很多张图,再叫UI妹子做的话,似乎也能解决, 但是实际效果吧,呵呵. 更重要的是从此以后UI妹子不仅不愿搭理你,连以后接触的机会都不会再给你了.好吧,iOS中我们其实不需要担心这个问题.使用UIBe

安卓自定义 View 进阶:贝塞尔曲线

在上一篇文章Path之基本图形中我们了解了Path的基本使用方法,本次了解Path中非常非常非常重要的内容-贝塞尔曲线. 一.Path常用方法表 为了兼容性(偷懒) 本表格中去除了在API21(即安卓版本5.0)以上才添加的方法.忍不住吐槽一下,为啥看起来有些顺手就能写的重载方法要等到API21才添加上啊.宝宝此刻内心也是崩溃的. 作用相关方法备注 移动起点moveTo移动下一次操作的起点位置 设置终点setLastPoint重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveT

Android自定义View进阶 - 贝塞尔曲线

Path之贝塞尔曲线 作者微博: @GcsSloop [本系列相关文章] 在上一篇文章Path之基本图形中我们了解了Path的基本使用方法,本次了解Path中非常非常非常重要的内容-贝塞尔曲线. 一.Path常用方法表 为了兼容性(偷懒) 本表格中去除了在API21(即安卓版本5.0)以上才添加的方法.忍不住吐槽一下,为啥看起来有些顺手就能写的重载方法要等到API21才添加上啊.宝宝此刻内心也是崩溃的. 作用 相关方法 备注 移动起点 moveTo 移动下一次操作的起点位置 设置终点 setLa

【转】贝塞尔曲线介绍

原文链接: http://blog.csdn.net/sangxiaonian/article/details/51984013 http://blog.csdn.net/sangxiaonian/article/details/51984584 http://blog.csdn.net/sangxiaonian/article/details/51985405 其他参考链接: https://www.jianshu.com/p/55c721887568 作为一个有只志向的码农,除了知道一些基本