如何从我的大螺旋中创建一个螺旋射击?

问题描述:

我使用python编码。我用下面的当前for循环创建了一个螺旋。我想在每10度左右创建一个微小的螺旋状越野。问题是我不知道该怎么做。我试图做这样的事情:如何从我的大螺旋中创建一个螺旋射击?

fractal image

我的问题是如何创造过笋?这甚至可能吗? 任何建议,非常感谢。

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) 
+1

我很困惑你的代码。当我在Python 2.7或3.5中使用'turtle'库时,我没有从'Turtle'对象的'forward'方法得到任何返回值。你也传递一个看起来像是一个角度而不是距离的值。你在使用非标准的“乌龟”模块吗? – Blckknght

+0

实际上,当我沿着圆弧或圆的圆周测量时,在远处使用“pi”可能是合适的,因此我的评论部分可能无效。 – Blckknght

一般来说,以编程方式绘制分形的最简单方法是使用递归。从代码开始绘制分形的一个“分段”。在你链接的图像中,这将是一个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),而不是减去固定金额。

每个迷你螺旋只是原始螺旋的一个较小的版本,因此您可以仔细地调用原始函数来制作每个较小的螺旋。

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会给你一个简单的螺旋例如。

这会为您提供以下类型的输出:

Turtle fractal spiral