斐波那契数列及螺线 基于C语言
斐波那契数列:fn = f(n-1) f(n-2),(n>=3),f1=1,f2=1 用语言描述,就是任何一项都是前面两项的和,第一项是1,第二项是1,第三项开始,每一项都是前面两项的和。 fn=1、2、3、5、8、13、21、34、55、89、144… 斐波那契数列又称黄金分割数列。
斐波那契螺线
斐波那契螺线如下图:
斐波那契螺线是什么?
如上图所示:斐波那契螺线由直线和圆弧组成。圆弧的半径为1、1、2、3、5、8、13… 也就是说,弧的半径是斐波那契数列的每一个项目。直线从原心开始,以弧的半径为长度,连接中心和弧起点。直线的方向是:右、上、左、下、右、上、左、下、右… 也就得出: 第n=0条直线向右:如果直线的起点是(500,500),以10个像素为单位,直线的终点是(510,500),弧的中心是(500,500),弧的起点是0度,终点是90度,半径是10; 第n=1项直线往上:直线的起点是(500,500),终点是(500,490),圆弧的圆心是(500,500),圆弧的起始角度是90度,终止角度是180度,半径是斐波那契数列的第二项1(此处为10,因为10个像素代表1) 第n=两条直线向左:直线的起点是(510,500),直线的终点是(490,500),圆弧的中心是(510,500),起点是180度,终点是270度,半径是斐波那契数列的第三项2(这里是20)。 第n=三条直线向下:直线的起点是(510,490),直线的终点是(510,520),弧的中心是(510,490),弧的起点是270度,终点是360度,半径是斐波那契数列的第三项3(这里是30)。 第n=四条直线向右:直线的起点是(490,490),直线的终点是(540,490),圆弧的中心是(490,490),圆弧的起点是360度,终点是450度,半径是斐波那契数列的第四项5(50)。 … 以此类推 第n=n项:如果n % 4 = 0 ,直线向右,直线的起点是(减去上一项的横坐标)f(n-2),上一项的纵坐标),直线的终点是(上一项的横坐标加上f(n-1),上一个纵坐标),圆弧的中心是直线的起点,圆弧的起始角度是90n终止角度为90度(n 1)度,弧的半径是斐波那契数列的N项 f(n). 如果n % 4 = 1 ,直线向上,直线的起点是(上项的横坐标,上项的纵坐标加上f(n-2),直线的终点是(上项的横坐标,上项的纵坐标减去f(n-1),圆弧的中心是直线的起点,圆弧的起始角度是90n终止角度为90度(n 1)度,弧的半径是斐波那契数列的N项f(n). 如果n % 4 = 2.直线向左,直线的起点是(上一项的横坐标加上f(n-2),上项纵坐标),直线的终点是(上项横坐标减去f(n-1),上一个纵坐标),圆弧的中心是直线的起点,圆弧的起始角度是90n终止角度为90度(n 1)度,弧的半径是斐波那契数列的N项f(n). 如果n % 4 = 3.直线向下,直线的起点是(上项的横坐标,上项的纵坐标减去f(n-2),直线的终点是(上项的横坐标,上项的纵坐标加上f(n-1),圆弧的中心是直线的起点,圆弧的起始角度是90n终止角度为90度(n 1)度,弧的半径是斐波那契数列的N项f(n).
二、代码如下
#include <graphics.h>
int main() { initgraph(1000, 1000); setbkcolor(WHITE); setcolor(BLACK); int x = 500, y = 500, x1 = 510, y1 = 500; int a = 0, b = 10, c = 0; for (int n = 0; x >= 0 || y >= 0; n ) { line(x, y, x1, y1); arc(x, y, 90 * n, 90 * (n 1), b); x1 = x; y1 = y; switch (n % 4) { case 0: y = y a; y1 = y1 - b; break; case 1: x = x a; x1 = x1 - b; break; case 2: y = y - a; y1 = y1 b; break; case 3: x = x - a; x1 = x1 b; break; } c = a b; a = b; b = c; } getch(); closegraph(); }
总结
这里用到了EGE画图模块,全称是Easy Graphics Engine,感谢作者提供的绘图模块。斐波那契螺线画完后,就像蜗牛一样。 以下是分析草图,有点乱。