2020-04
8

螺旋线

By xrspook @ 20:29:37 归类于: 扮IT

人家要我去学阿基米德螺旋线,但显然我是数学渣,根本领会到不到那些精神,转换不过来,就不要装着能转换。既然习题5说“或者其他种类的螺线”于是我就选择了在我理解范围内的斐波那契螺旋线,也就是黄金螺旋线。人家要我画螺旋线,我觉得要把方框也画出来才容易验证我自己有没有搞错。

为了完成方形和圆弧的两个循环,我笨蛋地把斐波那契数列算了两次……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import turtle, math
def arc(t, r, angle):
    n = 20 # int(2*math.pi*r/4)+3 公式画图太细致太慢,直接赋值加速
    step_length = int(2*math.pi*r)*angle/360/n
    step_angle = angle/n
    t.lt(step_angle/2) # 据说折腾一下角度能消除像素误差?
    polygon(t, step_length, n, step_angle)
    t.rt(step_angle/2)
def polygon(t, length, n, angle):
    for i in range(n):
        t.fd(length)
        t.lt(angle)
def start(t): # 起点要先偏移一些,每次方向保持一致
    t.pu()
    t.home()
    t.goto(160,-110)
def square(t, size): # 第一个正方形
    for i in range(4):
        t.lt(90)
        t.fd(size)                
    t.rt(90)
def boxes(t, n, size): # n-1个正方形
    a = b = 1
    base = size
    for i in range(n-1):
        for i in range(6):
            t.lt(90)
            t.fd(size)
        t.rt(90)
        fibo = a+b # 计算斐波那契数列
        a = b
        b = fibo
        size = base*fibo
def spiral(t, n, size): # 第一个正方形里没有弧线,所以弧线也是n-1
    a = b = 1
    base = size
    for i in range(n-1):
        arc(t, size, 90)        
        fibo = a+b # 在算一次斐波那契数列
        a = b
        b = fibo
        size = base*fibo
bob = turtle.Turtle()
bob.pensize(2) # 笔迹粗点好看些
n = 8
size = 20
start(bob)
square(bob, size)
boxes(bob, n, size)
start(bob)
spiral(bob, n, size)
turtle.mainloop()
2020-04
8

冷静不慌了

By xrspook @ 13:49:05 归类于: 扮IT

昨晚的习题2的花朵让我很郁闷,今天习题3的PIE我沉着冷静了,所以快速完成任务。

参考答案用的不是一个画法,我先画中间的梗,再画外面的框,参考答案是一个接一个三角形画。无论哪个,都逃不掉三角形边长的正弦计算,你叫小学生怎么画!!!两种画法如果设定的内径一样,画出的线条长度是一样的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import turtle, math
def pie(t, r, n): # t for turtle, r for radius, n for sides
    angle = 360/n
    for i in range(n):
        bob.fd(r)
        bob.bk(r)
        bob.lt(angle)
    bob.fd(r)
    bob.lt(180-(180-angle)/2)
    for i in range(n):    
        bob.fd(2*math.sin(math.radians(angle/2))*r)
        bob.lt(angle)
    bob.rt(180-(180-angle)/2)
def move(t, length): # t for turle
    t.pu()
    t.fd(length)
    t.pd()
bob = turtle.Turtle()
move(bob, -230)
pie(bob, 100, 5)
move(bob, 120)
pie(bob, 100, 6)
move(bob, 120)
pie(bob, 100, 7)
turtle.mainloop()
2020-04
8

为什么会被小海龟折磨

By xrspook @ 8:44:09 归类于: 烂日记

先画一个正方形,然后画一个正多边形,接着画一个圆形,最后画一个圆弧。从思路上说,再简单不过了,但实际上实施起来的时候,我还是花费了一点心思,但这些东西跟之后的用圆弧画出三个花朵比起来,我算是轻而易举就完成了的任务。后来的花朵之所以耗费了好几个小时才终于搞定,倒不是因为问题本身有多难,而是因为其实我没想通那些数学上的问题。我要画一朵花,花是由花瓣组成的。我画的那朵花是规则结构。那么画完一个花瓣到下一个花瓣的时候,角度我应该如何确定呢?这个问题很简单,但实际上我却在这里兜了无数个圈。我在那里瞎猜,所以很浪费时间。有无数次,我想直接去看答案了,但是我还是控制住了自己。当我终于画出一朵花,并在里面测试无论花瓣是胖是瘦,是多是少,我都能画出来以后,接下来我考虑的是如何一次性在一个面板上画出三朵花。画出一朵跟一次性画出三朵,其实已经非常接近了,但要怎么实现,还是费了一点心,因为某些函数的应用书上根本没说。我去网上稍微搜了一下,发现直接搬过来,而且是在没有看到例子的时候就搬过来行不通。最终我用了COPY大法,一次性画出了三朵花,虽然花的大小跟要求的有点差别。当我看过答案以后,我觉得这种差别是完全可以理解的。胖瘦跟大小是由他们设定的参数决定的,那些参数我们不可能知道。我只能模拟出个大概比例,要我完全模拟出一模一样是不可能的。

小海龟这个东西是一个画图的玩意,但是那又不像艺术家手里的画笔那样随心所欲。那是编程出来的,编程出来的东西还是有大神可以画出个小猪佩奇,但这些做法正如某些大神能用Excel的单元格画出他们想画的任意东西一样。

玩过成年人常规的编程以后再去搞这个小海龟,我觉得最难的地方在于数据的运用。你该怎么处理那些数据?难就难在那些公式设计上面。我不知道为什么Think Python 2这一章要这么整人,但也正是因为他们把我整得很惨,所以我在函数调用上面的确有了一些思路,而那种感觉是从前老师又或者我自学的课程里从来没接触过的。这些才是最核心的东西!为了让我懂得这个,他们祭出了从来都让我很崩溃的小海龟。

现在回想起来,为什么小学的时候小海龟会那么容易让我崩溃,估计情况跟现在差不多。在解决问题的时候我没有把那个箭头当作是一条数学题,一定程度上我把它当作是一个游戏了,所以当我不可以一口说出答案的时候,我首先开始做的是瞎掰,折腾好长时间以后我才终于静下心来,用脑子去考虑,这到底是怎么回事。所以可能某些东西的实现并不难,但是因为我耗在瞎掰上面的时间太多了,简直把我搞得慌张了,所以我会对那个东西瑟瑟发抖。把大问题解剖下来变成小问题,再逐个击破,我应该能很快的发现我的问题所在。

战胜人生中曾经不敢去面对的,非常有意思。

© 2004 - 2024 我的天 | Theme by xrspook | Power by WordPress