p5.js实现斐波那契螺旋的示例代码


Posted in Javascript onMarch 22, 2018

本篇文章主要介绍了p5.js实现斐波那契螺旋的示例代码,分享给大家,也给自己做个笔记

效果如下:

p5.js实现斐波那契螺旋的示例代码

主要方法

  1. translate()
  2. rotate()
  3. arc()

斐波那契螺旋

斐波那契螺旋线也称“黄金螺旋”,是根据斐波那契数列画出来的螺旋曲线,以斐波那契数为边的正方形中画一个90度的扇形,连起来的弧线就是斐波那契螺旋。

草图

p5.js实现斐波那契螺旋的示例代码

过程分解

一、定义一个空的斐波那契数组:

var Fibonacci = [];

二、初始化

默认情况下draw()函数会无限重复绘图, frameRate()函数可以设置每秒重复绘图的次数,就像电影每秒播放的帧数。

function setup(){
 createCanvas(windowWidth, windowHeight);//创建一块画板,画板的宽高与浏览器宽高相同
 background(255);//设置背景颜色为白色
 frameRate(10);//设置每秒10帧
}

三、设置斐波那契螺旋的样式

function draw(){
 ...
 stroke(0);//线条颜色为黑色
 noFill();//无填充色
 strokeWeight(5);//线条宽度为5
 translate(windowWidth/2, windowHeight/2);//将坐标系移动到页面中央
 ...
}

四、开始绘制斐波那契螺旋

function draw(){
 ...
 stroke(0);
 noFill();
 strokeWeight(5);
 translate(windowWidth/2, windowHeight/2);
 ...
 for( var i = 0; i < 20; i ++){//绘制20段90度弧线
  var a = i <= 1 ? 1 : Fibonacci[i-1] + Fibonacci[i-2];
//这是条件表达式,如果i等于0或1,那么a等于1;否则等于斐波那契数列前两项的和
  Fibonacci.push(a);//将新得到的a加入斐波那契数列中
  arc(0,0,a * 2,a * 2,0,PI / 2);//绘制圆心在(0,0)直径为2*a度数为90度的弧形

  /**********以下是为下一段弧线做准备************/
  rotate(PI / 2);//将坐标系按顺时针旋转90度
  translate(-Fibonacci[i-1],0); //将坐标系沿着X轴反向移动上一项的长度
 } 
}

五、让斐波那契螺旋动起来

function draw(){
 background(255);//将背景设置成白色,“遮盖”之前的绘图
 stroke(0);
 noFill();
 strokeWeight(5);
 translate(windowWidth/2, windowHeight/2);
 rotate(-PI / 6 * frameCount);//每帧旋转30度,frameCount表示当前已播放帧数
 for( var i = 0; i < 20; i ++){
  var a = i <= 1 ? 1 : Fibonacci[i-1] + Fibonacci[i-2];
  Fibonacci.push(a);
  arc(0,0,a * 2,a * 2,0,PI / 2);
  rotate(PI / 2);
  translate(-Fibonacci[i-1],0); 
 } 
}

完整代码

var Fibonacci = [];

function setup(){
 createCanvas(windowWidth, windowHeight);
 background(255);
 frameRate(10);
}

function draw(){
 background(255);
 stroke(0);
 noFill();
 strokeWeight(5);
 translate(windowWidth/2, windowHeight/2);
 rotate(-PI / 6 * frameCount);
 for( var i = 0; i < 20; i ++){
  var a = i <= 1 ? 1 : Fibonacci[i-1] + Fibonacci[i-2];
  Fibonacci.push(a);
  arc(0,0,a * 2,a * 2,0,PI / 2);
  rotate(PI / 2);
  translate(-Fibonacci[i-1],0); 
 } 
}

function windowResized(){
 resizeCanvas(windowWidth, windowHeight);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript利用初始化数据装配模版的实现代码
Nov 17 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
Nov 28 Javascript
jquery的index方法实现tab效果
Feb 16 Javascript
node.js中的fs.open方法使用说明
Dec 17 Javascript
jquery实现聚光灯效果的方法
Feb 06 Javascript
基于JavaScript代码实现pc与手机之间的跳转
Dec 23 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
May 24 Javascript
最佳的JavaScript错误处理实践
Jul 16 Javascript
详解vee-validate的使用个人小结
Jun 07 Javascript
Vue调试神器vue-devtools安装方法
Dec 12 Javascript
深入理解es6块级作用域的使用
Mar 28 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
Nov 11 Javascript
基于JavaScript实现幸运抽奖页面
Jul 05 #Javascript
Vue封装一个简单轻量的上传文件组件的示例
Mar 21 #Javascript
基于vue-video-player自定义播放器的方法
Mar 21 #Javascript
基于iScroll实现内容滚动效果
Mar 21 #Javascript
JS中的回调函数实例浅析
Mar 21 #Javascript
使用Vue制作图片轮播组件思路详解
Mar 21 #Javascript
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
Mar 21 #Javascript
You might like
smarty中post用法实例
2014/11/28 PHP
常见php数据文件缓存类汇总
2014/12/05 PHP
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
JS分割字符串并放入数组的函数
2011/07/04 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
鼠标滚轮改变图片大小的示例代码
2013/11/20 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
AngularJs解决跨域问题案例详解(简单方法)
2016/05/19 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
Angular 2.0+ 的数据绑定的实现示例
2017/08/09 Javascript
Mac中安装nvm的教程分享
2017/12/11 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
简单的React SSR服务器渲染实现
2018/12/11 Javascript
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
openlayers实现地图弹窗
2020/09/25 Javascript
[01:19:46]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第一场 2月28日
2021/03/11 DOTA
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
python opencv进行图像拼接
2020/03/27 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
应届生保险求职信
2013/11/11 职场文书
低碳日宣传活动总结
2014/07/09 职场文书
家长会欢迎词
2015/01/23 职场文书
大学生求职信怎么写
2015/03/19 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
表扬信范文
2019/04/22 职场文书