如何从我较大的螺旋线上创建螺旋式离线?

时间:2016-03-14 20:30:20

标签: python fractals

我在python中编码。我用下面的当前循环创建了一个螺旋线。我想在每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)

2 个答案:

答案 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级别调用它会给你一个简单的螺旋例如。

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

Turtle fractal spiral