如何从我的大螺旋中创建一个螺旋射击?
我使用python编码。我用下面的当前for循环创建了一个螺旋。我想在每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)
一般来说,以编程方式绘制分形的最简单方法是使用递归。从代码开始绘制分形的一个“分段”。在你链接的图像中,这将是一个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
会给你一个简单的螺旋例如。
这会为您提供以下类型的输出:
我很困惑你的代码。当我在Python 2.7或3.5中使用'turtle'库时,我没有从'Turtle'对象的'forward'方法得到任何返回值。你也传递一个看起来像是一个角度而不是距离的值。你在使用非标准的“乌龟”模块吗? – Blckknght
实际上,当我沿着圆弧或圆的圆周测量时,在远处使用“pi”可能是合适的,因此我的评论部分可能无效。 – Blckknght