编程语言
首页 > 编程语言> > python – 实现Koch曲线?

python – 实现Koch曲线?

作者:互联网

我正在查看Koch Snowflake(here)的维基百科页面,并且被徽标/乌龟风格的所有示例所困扰.所以我开始自己制作返回列表或坐标.

我的实现是在python中,我基本上扯掉了python turtle实现,但用基本的trig替换了特定于龟的东西.它导致了一些丑陋的代码.我面临的挑战是要么改进我的代码,要么提出更自己的解决方案.它可以是python或您最喜欢的语言.

我的代码:

from math import sin, cos, radians

def grow(steps, length = 200, startPos = (0,0)):
    angle = 0
    try:
        jump = float(length) / (3 ** steps)
    except:
        jump = length

    set="F"
    for i in xrange(steps): set=set.replace("F", "FLFRFLF")

    coords = [startPos]
    for move in set:
        if move is "F": 
            coords.append(
              (coords[-1][0] + jump * cos(angle),
               coords[-1][1] + jump * sin(angle)))
        if move is "L":
            angle += radians(60)
        if move is "R":
            angle -= radians(120)

    return coords

编辑:由于懒惰复制,我忘了导入

解决方法:

我不认为它特别难看,我只会逐渐重构它,例如作为第一步(我已经删除了尝试/除了因为我不知道你要阻止什么…如果它需要重新进入它应该更明确一点,恕我直言):

import math

angles = [math.radians(60*x) for x in range(6)]
sines = [math.sin(x) for x in angles]
cosin = [math.cos(x) for x in angles]

def L(angle, coords, jump):
    return (angle + 1) % 6
def R(angle, coords, jump):
    return (angle + 4) % 6
def F(angle, coords, jump):
    coords.append(
        (coords[-1][0] + jump * cosin[angle],
         coords[-1][1] + jump * sines[angle]))
    return angle

decode = dict(L=L, R=R, F=F)

def grow(steps, length=200, startPos=(0,0)):
    pathcodes="F"
    for i in xrange(steps):
        pathcodes = pathcodes.replace("F", "FLFRFLF")

    jump = float(length) / (3 ** steps)
    coords = [startPos]
    angle = 0

    for move in pathcodes:
        angle = decode[move](angle, coords, jump)

    return coords

如果第二步是有保证的,我可能会把这个功能推到一个班级,但我不确定这会使事情变得更好(或者,事实上更好;-).

标签:python,fractals
来源: https://codeday.me/bug/20190724/1520131.html