我正在查看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
编辑:由于懒惰复制,我忘了导入
答案 0 :(得分:7)
我不认为它特别难看,我只是逐步重构它,例如作为第一步(我已经删除了try/except
,因为我不知道你要阻止它...如果它需要重新进入它应该更明确一点,恕我直言):
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
如果有必要采取第二步,我可能会将此功能推广到一个班级,但我不确定这会使事情变得更好(或者,事实上更好; - )。
答案 1 :(得分:2)
我非常喜欢你的问题,因此我将答案作为一个新问题发布,以便其他人可以改进它:
https://stackoverflow.com/questions/7420248
我没有使用Logo / Turtle的东西,也没有使用三角法。
祝贺第一个将此问题带到StackOverflow!
答案 2 :(得分:0)
Mathematica在数学方面更胜一筹:
points = {{0.0, 1.0}};
koch[pts_] := Join[
pts/3,
(RotationMatrix[60 Degree].#/3 + {1/3, 0}) & /@ pts,
(RotationMatrix[-60 Degree].#/3 + {1/2, 1/Sqrt[12]}) & /@ pts,
(#/3 + {2/3, 0}) & /@ pts
];
Graphics[Line[Nest[koch, points, 5]], PlotRange -> {{0, 1}, {0, 0.3}}] //Print
答案 3 :(得分:0)
要考虑的是,如果不是为了实现测试你的实现,那么Python龟可以记录它正在做的事情并给你回到坐标。您在要记录的代码周围使用begin_poly()
和end_poly()
,然后使用get_poly()
获取积分。
在这个例子中,我将基于code from this site绘制雪花,然后将这些坐标注册为一个新的乌龟形状,我将随机(并快速)在屏幕上标记:
import turtle
from random import random, randrange
def koch_curve(turtle, steps, length):
if steps == 0:
turtle.forward(length)
else:
for angle in [60, -120, 60, 0]:
koch_curve(turtle, steps - 1, length / 3)
turtle.left(angle)
def koch_snowflake(turtle, steps, length):
turtle.begin_poly()
for _ in range(3):
koch_curve(turtle, steps, length)
turtle.right(120)
turtle.end_poly()
return turtle.get_poly()
turtle.speed("fastest")
turtle.register_shape("snowflake", koch_snowflake(turtle.getturtle(), 3, 100))
turtle.reset()
turtle.penup()
turtle.shape("snowflake")
width, height = turtle.window_width() / 2, turtle.window_height() / 2
for _ in range(24):
turtle.color((random(), random(), random()), (random(), random(), random()))
turtle.goto(randrange(-width, width), randrange(-height, height))
turtle.stamp()
turtle.done()
如果您不希望用户看到此步骤,您可以在多边形生成期间隐藏笔和龟。