python画正方形螺旋线(python绘制正螺方)

http://www.itjxue.com  2023-03-06 06:09  来源:未知  点击次数: 

python怎样改才能变为,正方形,不是长方形的螺旋线?

如下图所示,把代码中对应部分代码改成红圏处样式

运行结果展示

上图为运行结果,不知是否符合需求

如何用python turtle画斐波那契螺旋曲线?

我把矩形和圆弧都用不同颜色填充了,你按照自己的需求修改一下吧,你的题目说的不清楚。

#?Python3.6

#?使用turtle绘制Fibonacci螺旋

def?draw_fibonacci(x):

????#?F0=1

????#?F1=1

????#?Fn=F(n-1)+F(n-2)

????#?产生斐波那契数列,用于查表

????#?像这种计算复杂性指数增长的计算,不要写个函数去每次求一个数

????#?最好的办法是,按照规律写出查找表,用查找的方法来得到数据

????f_list?=?[]

????for?i?in?range(x):

????????if?i?==?0:

????????????f_list.append(1)

????????elif?i?==?1:

????????????f_list.append(1)

????????else:

????????????f_list.append(f_list[i-1]+f_list[i-2])

????#?像素比例

????f0?=?50

????#?设置画笔属性

????turtle.pensize(5)

????turtle.pencolor("black")

????turtle.penup()

????turtle.home()

????turtle.pendown()

????for?i?in?range(0,?len(f_list)):

????????#?绘制速度,1~10个不同速度等级,小于1或者大于10立即绘制

????????turtle.speed(1)

????????turtle.pendown()

????????#?绘制矩形

????????if?i?==?0:

????????????fill_color?=?"black"

????????else:

????????????fill_color?=?(random.random(),?random.random(),?random.random())

????????turtle.fillcolor(fill_color)

????????turtle.begin_fill()

????????turtle.forward(f_list[i]*f0)

????????turtle.left(90)

????????turtle.forward(f_list[i]*f0)

????????turtle.left(90)

????????turtle.forward(f_list[i]*f0)

????????turtle.left(90)

????????turtle.forward(f_list[i]*f0)

????????turtle.left(90)

????????turtle.end_fill()

????????#?绘制圆弧

????????fill_color?=?(random.random(),?random.random(),?random.random())

????????turtle.fillcolor(fill_color)

????????if?i?==?0:

????????????turtle.forward(f_list[i]?*?f0?/?2)

????????????turtle.begin_fill()

????????????turtle.circle(f_list[i]?*?f0?/?2,?360)

????????????turtle.end_fill()

????????????#?移动到一下起点

????????????turtle.forward(f_list[i]?*?f0?/?2)

????????????continue

????????else:

????????????turtle.begin_fill()

????????????turtle.circle(f_list[i]?*?f0,?90)

????????????turtle.left(90)

????????????turtle.forward(f_list[i]?*?f0)

????????????turtle.left(90)

????????????turtle.forward(f_list[i]?*?f0)

????????????turtle.end_fill()

????????#?移动到一下起点

????????turtle.speed(0)

????????turtle.penup()

????????turtle.left(90)

????????turtle.forward(f_list[i]?*?f0)

????????turtle.left(90)

????????turtle.forward(f_list[i]?*?f0)

????turtle.done()

if?__name__?==?"__main__":

????draw_fibonacci(6)

下面是我跑出来的结果:

如何用Python语言编写螺旋线???

#coding=utf-8

from?math?import?sqrt,cos,sin

import?Image,?ImageDraw

class?SpireShape(object):

????def?__init__(self,?draw):

????????self.draw?=?draw

????????self.line_width?=?1

????????self.line_color?=?(0,0,0)

????????self.current_point?=?(0,?0)

????def?setPoints(self,points):

????????self.points?=?points

????def?setLineWidth(self,line_width):

????????self.line_width?=?line_width

????def?setLineColor(self,line_color):

????????self.line_color?=?line_color

????

????def?moveto(self,?p):

????????self.current_point?=?p

????

????def?lineto(self,?p):

????????self.draw.line((self.current_point,?p),?width=self.line_width,?fill=self.line_color)

????????self.current_point?=?p

????def?point(self,?p):

????????self.draw.point(p,fill=self.line_color)

????????self.current_point?=?p

????def?spire(self,?p,?angle,rate):

????????'''

????????p?is?start?point,angle?is?start?angle,rate?is?scatter?speed?len/thita.

????????????'''

????????r?=?0;

????????thita?=?0;

????????pi?=?3.14

????????du?=?2*pi/360

????????while?r=500.0:

????????????posX?=?r*cos(thita+angle*du)

????????????posY?=?r*sin(thita+angle*du)

????????????

????????????pSpare?=(posX+p[0],posY+p[1])

????????????self.point(pSpare)

????????????r?=?r+thita*rate

????????????thita?=?thita+du

???????

#?测试代码

if?__name__?==?'__main__':

????im?=?Image.new('RGBA',?(1024,1024),?(255,255,255))

????draw?=?ImageDraw.Draw(im)

????b?=?SpireShape(draw)

????point?=?(500,500)

????b.spire(point,0,0.2)

????#b.spire(point,90,0.2)

????

????del?draw

????im.show()

python-第八课-伟大的循环之漂亮的螺旋线

本节课通过绘制复杂的螺旋线来深入学习for循环和range()函数的用法。深入了解循环的程序过程。

(1)for循环的用法

(2)range()函数的用法

(3)绘制螺旋线

(1)import

(2)turtle.Pen()

(3)forward()

(4)right()

(5)for循环

(6)range()

(3)执行t.forward(x)语句让海龟画笔向前移动x步。由于x=0,所以画笔向前移动0步。

(4)执行t.right(72)语句,让海龟画笔向右转动72°。

(5)执行第二次循环,for循环访问range列表中的第二个元素1,并将1存储在变量x中,变量x的值变为1.接着画笔向前移动1步,画笔向右转动72°。

(6)执行第三次循环,for循环访问range列表中的第三个元素2,并将2存储在变量x中,变量x的值变为2,接着画笔向前移动2步,画笔向右转动72°。

(7)这样一次一次地继续执行,当for循环遍历range中最后一个元素99时,变量x的值就为99,画笔向前移动99步,并向右转动72°。这样就画出一个漂亮的螺旋线。

上面的程序中,如果我们将每次绘制旋转的角度改变一下会绘制出什么图形呢?

总结用python绘制正多边形的规律?

如果能够找到规律,可以让代码变得更简单。上述代码中其实就是调用circle()函数四次,每次传入参数不同而已。

我们可以加入循环,循环就是重复不停地做相同的事情;再找到循环变量和画圆参数之间的规律即可。

第一个圆的半径为50,每次按15的节奏递减,直到绘制完半径为5的圆。这样就可以使用range()函数,传入如下参数:range(50,0,-15)。

或者由小到大绘制,传入这样的参数也可以:range(5,51,15)。

还可以这样:循环四次,循环变量i依次为0、1、2、3,再在绘制圆的过程中构造递减的表达式:100/2-i*15。

分析这个表达式,当i等于0时,结果为50,绘制半径为50的圆;当i等于1时,结果为35,绘制半径为35的圆……正好符合题目要求的参数值。

【扩展】思考如何绘制以坐标原点为中心的同心圆呢?

仔细观察画笔绘制圆的轨迹,可发现:默认小海龟从坐标原点出发,逆时针旋转一圈画圆;然后,再回到起始点。

所以,绘制同心圆。我们需要将画笔向下移动一定的距离,即改变y的坐标,x坐标保持不变为0。参考代码如下:

循环体内,每次需要抬笔和落笔功能。

02

案例二:绘制一个正多边形

绘制正多边形有这样一个结论:用360°去除以绘制的边数,即可得到旋转角度。

比如:正三角形的旋转角度(360/3=120°)、正四边形的旋转角度(360/4=90°)、正八边形的旋转角度(360/8=45°)。其他以此类推。

那么,我们要绘制一个正八边形呢?

使用循环结构,循环八次。每次前移一定距离,再旋转(360/边数)的角度,这里旋转的就是45°角。参考代码如下:

有了这样的结论,其他的正多边形都可以信手拈来,小菜一碟了。只需要稍微改几个参数即可。

03

案例三:绘制由多种颜色组成的正螺旋线

比如,这样的图形:

这是由八种颜色组成的正八边形螺旋线结构图,颜色依次为:红(red)、绿(green)、蓝(blue)、黄(yellow)、紫(purple)、橙(orange)、黑(black)、粉(pink)等八种。

绘制思路:

首先,需要创建一个颜色列表list,含有八种颜色元素。

第二,前移一定距离,这个距离值是由小到大逐级递增的过程。

第三,旋转一定角度,可参照案例二的结论。

最后,考虑画笔的颜色,每8次(边数)为一个周期循环颜色列表。

参考代码如下:

其他的正螺旋线,也是如此规律。

【扩展】如果是有一定旋转角度的螺旋线呢?比如,这样的图形:

解题思路:只需要在正螺旋线的基础上,让旋转角度多偏移1-2°即可。修改上述案例中最后一行的代码:

如何采用Python语言绘制一个螺旋线

打开直接的IDLE软件,也就是Python语言shell的界面。 单击“file”-“new file”新建立一个脚本。 保存文件,在脚本界面中,选中“file”-“save”,就会出现保存的配置界面; 配置文件名并且单击“保存”就可以啦

(责任编辑:IT教学网)

更多

推荐网站策划文章