我在python中编码。我用下面的当前循环创建了一个螺旋线。我想在每10度左右创造一个微小的螺旋形射击。问题是我不知道该怎么做。我正在尝试做这样的事情:
我的问题是如何制作拍摄照片?这甚至可能吗? 非常感谢任何建议。
import turtle
import math
me = turtle.Turtle()
def miniSpiral():
for i in range(0,360):
x,y = me.position()
me.left(1)
if x%10==0:
x2,y2 = me.forward(((5*i)+5)*math.pi/360)
else:
x2,y2= me.forward(5*math.pi/360)
me.goto((x+x2),(y+y2))
for x2 in range(0,720):
me.left(1)
if x2%10==0:
me.forward(((10*x2)+10)*math.pi/360)
#miniSpiral()
me.forward(10*math.pi/360)
答案 0 :(得分:1)
通常,以编程方式绘制分形的最简单方法是使用递归。从代码开始绘制分形的一个“片段”。在您链接的图像中,这将是一个90度的螺旋形(因为这是分支之间的距离)。
一旦有了可以绘制一个段的代码,就可以添加一个递归调用。给它一些参数(例如初始大小),并使递归调用减少传递给下一个调用的值。添加一个基本情况,其中跳过具有该参数设置太小的调用(例如if size < 1: return
),以便递归不会永远继续。
现在您可以添加分支。不只是一个递归调用,而是两个。你需要添加一些额外的逻辑来在调用之间移动乌龟的位置(所以第二个开始于与第一个大致相同的位置),但这不应该太难。要使两个分支不同,请改变它们的初始位置或角度,或给它们不同的参数。在你的示例图像中,“额外”分支都从“主”分支开始朝向对方方向,并且它们开始变小。
这是你想要的螺旋的伪代码实现(我没有添加实际的turtle
代码,因为你似乎使用了不同的turtle
模块而不是标准库中的模块):
def spiral(size):
if size < 1: return # base case
draw_segment(size) # this draws a 90 degree piece of the spiral
position = getposition() # save state so we can back up after the first recursive call
angle = getangle()
spiral(size - 1) # main branch of the recursion
penup() # restore state (mostly)
setposition(position)
pendown()
setangle(angle + 180) # we want to start facing the other direction for the second branch
spiral(size - 2) # extra branch of the recursion
您可以使用详细信息(例如如何修改递归调用的size
)以满足您的口味或您正在寻找的分形设计。例如,您可以将大小乘以某个因子(例如size * 0.75
),而不是减去固定金额。
答案 1 :(得分:0)
每个迷你螺旋只是原始螺旋的一个较小版本,因此你可以小心地调用原始函数来制作每个小螺旋。
import turtle
import math
def spiral(steps, left, forward, level):
for step in range(50, steps):
me.left(left)
me.forward(step / forward)
if step % 200 == 0 and level > 0:
x, y = me.position()
heading = me.heading()
spiral((steps * 2) / 3, -left * 1.2, forward * 1.2, level - 1)
me.up()
me.setpos(x, y)
me.setheading(heading)
me.down()
#turtle.tracer(5, 200) # to speed things up
me = turtle.Turtle()
spiral(800, 0.6, 200.0, 4)
每次调用spiral()
时,参数都会稍微修改,级别会减少1
。同样,left
参数为负,其具有改变每个子螺旋的方向的效果。在200
步之后调用每个子螺旋。每个子螺旋有2 / 3rds的原始步骤等等......很多数字可以看到它们如何影响结果。当子螺旋完成绘制时,它会跳回到开始绘制它的点,继续原始螺旋。
以0
级别调用它会给你一个简单的螺旋例如。
这将为您提供以下类型的输出: