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 相关文章推荐
js函数模拟显示桌面.scf程序示例
Apr 20 Javascript
基于jQuery实现仿淘宝套餐选择插件
Mar 04 Javascript
JavaScript实现select添加option
Jul 03 Javascript
JS实现黑客帝国文字下落效果
Sep 01 Javascript
canvas实现弧形可拖动进度条效果
May 11 Javascript
基于JavaScript实现百度搜索框效果
Jun 28 Javascript
详解React 16 中的异常处理
Jul 28 Javascript
jQuery+ajax读取json数据并按照价格排序示例
Mar 28 jQuery
Vue中使用Sortable的示例代码
Apr 07 Javascript
vue 进阶之实现父子组件间的传值
Apr 26 Javascript
layer弹出层倒计时关闭的实现方法
Sep 27 Javascript
vue-cli3 引入 font-awesome的操作
Aug 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
PHP fopen()和 file_get_contents()应用与差异介绍
2014/03/19 PHP
PHP zip扩展Linux下安装过程分享
2014/05/05 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
2019/02/27 PHP
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
javascript 尚未实现错误解决办法
2008/11/27 Javascript
jquery 最简单的属性菜单
2009/10/08 Javascript
jQuery 动态酷效果实现总结
2009/12/27 Javascript
jquery动态加载图片数据练习代码
2011/08/04 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
JavaScript实现打开链接页面的方式汇总
2016/06/02 Javascript
jQuery中text() val()和html()的区别实例详解
2016/06/28 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
详解在vue-cli中使用路由
2017/09/25 Javascript
javascript History对象原理解析
2020/02/17 Javascript
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
Python实现查找系统盘中需要找的字符
2015/07/14 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
2017/12/15 Python
python回调函数中使用多线程的方法
2017/12/25 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
python模块hashlib(加密服务)知识点讲解
2019/11/25 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
python 使用事件对象asyncio.Event来同步协程的操作
2020/05/04 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
使用CSS3实现多列布局与多背景的技巧
2016/02/29 HTML / CSS
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
水毁工程实施方案
2014/04/01 职场文书
2014党员四风对照检查材料思想汇报
2014/09/17 职场文书
心理学培训心得体会
2016/01/22 职场文书
《司马光》教学反思
2016/02/22 职场文书