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 22 Javascript
jQuery Selector选择器小结
May 06 Javascript
js限制textarea每行输入字符串长度的代码
Oct 31 Javascript
jQuery中triggerHandler()方法用法实例
Jan 19 Javascript
使用console进行性能测试
Apr 27 Javascript
JavaScript实现广告的关闭与显示效果实例
Jul 02 Javascript
JQuery的attr 与 val区别
Jun 12 Javascript
js判断PC端与移动端跳转
Dec 24 Javascript
浅析bootstrap原理及优缺点
Mar 19 Javascript
vue实现点击展开点击收起效果
Apr 27 Javascript
webpack之引入图片的实现及问题
Oct 08 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
Dec 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
这部番真是良心,画质好到像风景区,剧情让人跟着小公会热血沸腾
2020/03/10 日漫
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
PHP不用递归遍历目录下所有文件的代码
2014/07/04 PHP
PHP 微信支付类 demo
2015/11/30 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
JS前端开发判断是否是手机端并跳转操作(小结)
2017/02/05 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
移动端web滚动分页的实现方法
2017/05/05 Javascript
使用JavaScript实现点击循环切换图片效果
2017/09/03 Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
2019/05/30 Javascript
Openlayers3实现车辆轨迹回放功能
2020/09/29 Javascript
Vue使用Element实现增删改查+打包的步骤
2020/11/25 Vue.js
python解析xml文件实例分享
2013/12/04 Python
Python实现的爬虫功能代码
2017/06/24 Python
Python递归实现汉诺塔算法示例
2018/03/19 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
pyQt5实时刷新界面的示例
2019/06/25 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
python中p-value的实现方式
2019/12/16 Python
如何给Python代码进行加密
2020/01/10 Python
浅谈sklearn中predict与predict_proba区别
2020/06/28 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
Farfetch中文官网:奢侈品牌时尚购物平台
2020/03/15 全球购物
Java如何格式化日期
2012/08/07 面试题
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
程序员经常用到的UNIX命令
2015/04/13 面试题
高中数学教师求职信
2013/10/30 职场文书
法定代表人授权委托书范文
2014/09/22 职场文书
车辆委托书范本
2014/10/05 职场文书
门球健将观后感
2015/06/16 职场文书
python爬取豆瓣电影TOP250数据
2021/05/23 Python