用JS画斐波那契螺旋线(黄金螺旋线)

偶然看到斐波那契螺旋线(黄金螺旋线)的定义及画图方法,试着用JS画了一下,很漂亮,很好玩

具体定义及画法大家查一下就有了,很简单。

以下是代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>FibonacciSequence</title>
</head>
<body>
<canvas id="myCanvas" width="1000" height="800" style="background-color:#ddd;"></canvas>

<input type="text" onchange="draw_many(parseInt(this.value))" />

<script type="text/javascript">

var canvas=document.getElementById(‘myCanvas‘);
var ctx=canvas.getContext(‘2d‘);

//优化的斐波那契数列计算,把数列结果用数组保存
//用传统递归太慢了太费内存了
var fib_val = [0,1]
function fib (n) {
    var len = fib_val.length;
    for(var i=len; i<=n; i++){
        fib_val.push( fib_val[i-1] + fib_val[i-2] )
    }
    return fib_val[n]
}

//画斐波那契螺旋线(黄金螺旋线)
//n表示计算数列到多少
function draw (n) {
    for (var i = 1; i < n; i++) {
        var len = fib(i);
        //ctx.strokeRect(0,0,len,len)//画矩形的,可以看到产生的原理
        //画扇形
        ctx.beginPath();
        ctx.arc(len,0,len,Math.PI/2,2*Math.PI/2);
        ctx.stroke();

        //把原点移到原来原点的对角线上,然后旋转270度
        //这样画起来简单
        ctx.translate(len, len)
        ctx.rotate(3*Math.PI/2);
    };
}

//画好多条螺旋线,漂亮
function draw_many (n) {
    var total = n
    //清除画布
    ctx.clearRect(0,0,800,800);
    for(var i=0;i<total;i++){
        //保存状态,这样好恢复原点之类的状态
        ctx.save();
        //中心移到画布中间
        ctx.translate(400,400);
        //画一条旋转一点
        ctx.rotate(360/total*i*Math.PI/180);
        draw(15);
        //恢复状态
        ctx.restore();
    }
}

//画180条线,很漂亮
draw_many(180)

</script>
</body>
</html>

下面是效果,试着改一下画的数量看,按回车看效果

输入要画线的数量: 显示矩形

时间: 2024-10-05 05:04:58

用JS画斐波那契螺旋线(黄金螺旋线)的相关文章

js 生成斐波那契数列

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>fibonacci</title> </head> <body> <script> // end 多少数以内 function fibonacci(end) { var num1 = 0; var num2 = 1; va

JS 从斐波那契数列浅谈递归

一.前言 昨晚下班后,经理出于兴趣给我们技术组讲了讲算法相关的东西,全程一脸懵逼的听,中途还给我们出了一道比较有趣的爬楼问题,问题如下: 假设一个人从地面开始爬楼梯,规定一步只能爬一坎或者两坎,人只能往上走,例如爬到第一坎,很明显从地面到第一坎只有一种可选方式,从地面爬到第二坎,他可以从地面直接跨到第二坎,也可以先从地面到第一坎,再从第一坎到第二坎,也就是2种可选方式,那么求他爬到N楼一共有几种可选方式. 这道题涉及到了斐波那契数列,要求使用递归来求值,技术贼菜的我也是一脸懵逼,所以本着学习的心

JS写斐波那契数列第n项

斐波那契数列:1 1 2 3 5 8 13 21 34 ... 数列特点:f(n)=f(n–1)+f(n–2)  后一项等于前两项之和 var a=0: var b=1: var c: var n=2://第n项 for(var i=0:i<n:i++){ c=b: b=a+b: a=c: } console.log(b)://打印第n项

JS求斐波那契数列的N项

第一种求法: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title></head><body> <script> var num = [0,1]; function figure(){ if(num.length < N){ var newN

js算法集合(二) javascript实现斐波那契数列 (兔子数列) Javascript实现杨辉三角

js算法集合(二)  斐波那契数列.杨辉三角 ★ 上一次我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,这次,我们来对斐波那契数列和杨辉三角进行研究,来加深对Javascript的理解. 一.Javascript实现斐波那契数列 ①要用Javascript实现斐波那契数列,我们首先要了解什么是斐波那契数列:斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为

斐波那契数列公式算法-JS实现

之前算斐波那契数列都是算前两个数相加实现的 比如0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368 2=1+1 3=1+2 5=2+3 8=3+5 …… 其实还有另外一个规律: 2 = 1*2-03 = 2*2-15 = 3*2-18 = 5*2-213= 8*2-321=13*2-5 …… 下面是JS实现的代码: <!DOCTYPE h

Tips_of_JS 之 利用JS实现水仙花数的寻找与实现斐波那契数列

一.水仙花数 1.啥是水仙花数? 水仙花数是指一个 n 位正整数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1^3 + 5^3+ 3^3 = 153) 2.利用JS实现对水仙花数的寻找. 这一次我们寻找水仙花数的方法,是JS中非常基础的while循环.代码如下: si不si很神奇~ 二.斐波那契数列 1.啥是斐波那契数列? 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔

js 斐波那契数列(兔子问题)

对于JS初学者来说,斐波那契数列一直是个头疼的问题,总是理不清思路. 希望看完这篇文章之后会对你有帮助. 什么是斐波那契数列 : 答: 斐波那契数列,又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列".  指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.-- 题目:有个人想知道,一年之内一对兔子能繁殖多少对?于是就筑了一道围墙把一对兔子关在里面.已知一对兔子每个月可以生一对小兔子,而一对

js斐波那契数列

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89...... 这个数列从第3项开始,每一项都等于前两项之和. 1.递归算法: function fib(n) { if (n < 2) { return n; }else { return fib(n-1) + fib(n-2); } } 2.动态规划算法 function fib(n) { var val = []; for (var i = 0; i <= n; ++i) { val[i