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
7

阴魂不散的小海龟

By xrspook @ 21:56:27 归类于: 扮IT

LOGO语言小海龟,你为啥阴魂不散啊啊啊啊啊啊啊啊啊啊!!!!!对从前小学3年级的我来说是个噩梦,现在依然是个噩梦!Think Python 2的第四章正是用这个turtle讲故事,想死的心都有了。没有一定英语基础,没有足够强悍的数学基础,怎么可能玩得转小海龟,而且还要空间思维能力。小时候我对这个东西瑟瑟发抖实在太正常了…… 25年后再遇到,我继续纠结得死去活来……

第四章最后的习题1要求画一个堆栈图,不知道他们到底要画些什么,要画到什么程度,mindmanager了一个,画完以后的确对函数的嵌套有点开窍。

习题2要画3朵花,画得我死去活来…… 但总算完全不看答案能画出来,看完答案,得到那些偷偷摸摸设定的参数后能画得跟要求一模一样。

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
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 flower(t, p, r, a): # t for turtle, p for petal, r for radius, a for angle
    for i in range(p):
        for i in range(2): # 重复两次画花瓣,两次转向后和初始方向一致,非常重要!!!!!
            arc(t, r, a)
            t.lt(180-a)
        t.lt(360/p)
def move(t, length): # 一个画板画3朵花必须用暗中位移
    t.pu()
    t.fd(length)
    t.pd()
bob = turtle.Turtle()
move(bob, -100)
flower(bob, 7, 60, 60) # 偷偷设定半径和角度,万恶的例子,叫人怎么猜!于是我也直接搬!
move(bob, 100)
flower(bob, 10, 40, 80)
move(bob, 100)
flower(bob, 20, 140, 20)
turtle.mainloop()
2020-04
3

四行四列的小网格

By xrspook @ 22:17:26 归类于: 扮IT

先放效果图

Think Python 2 第三章练习题三我的解决办法。只能用学过的语句(还没讲到循环),for啊,while啊都不许用,于是我只能很蛮很直接了。如果要绘制两行两列的小网格,我只需把do_twice里的a、b函数从现在的重复4次变成重复两次即可。我觉得自己的脚本比官方提供的四行四列的小网格绘制法更易懂肿么破。

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
def plus():
    print('+ ', end='')
def minus():
    print('- ' * 4, end='')
def bar():
    print('| ', end='')
def space():
    print('  ' * 4, end='')
def do_twice(a,b):
    a()
    b()
    a()
    b()
    a()
    b()
    a()
    b()
def do_four():
    col()
    col()
    col()
    col()
def col():
    do_twice(bar,space)
    bar()
    print('')    
def row():
    do_twice(plus,minus)
    plus()
    print('') 
def print_grid():
    do_twice(row,do_four)
    row()
print_grid()
2019-12
7

2020年的目标:学习R语言

By xrspook @ 21:57:29 归类于: 烂日记

昨天我花了很多时间去研究R语言里面的绘图。R语言这种东西是今年夏天我才开始接触的,当时我看的是head first系列的数据分析。在这本书里面,R语言用得非常多。首次接触那个东西时我就觉得,那个比Excel厉害太多了。作图这种东西,貌似是美工,但实际上,在R语言里面,只要你想得出来,你就可以通过编程去实现,牛逼轰轰的。无论你想得出的,又或者是想不出的功能,它都能做到。突然之间我觉得自己在统计分析这个问题上真的是个白痴。一直以来我都觉得自己在理论知识方面很缺乏,但原来我在技术的使用方面更加是井底之蛙。如果我要提高我的理论水平,如果直接从案例从技术方面入手,也是可以实现的。我得知道别人是怎么做的。别人用什么方式去实现的。为什么别人可以从那个视角去分析问题,而我却没想到。同样的原始数据,为什么别人就能揪出一些我没想到的东西。这一点我必须努力加把劲探索。

昨天从中午开始我就纠结R语言的散点图。散点图这种东西,Excel里也能做,但问题是Excel里面没办法做出矩阵散点图。之所以我中午开始纠结R语言,因为我在几个月前到数据分析教程里知道学习里知道了R语言可以用几句非常简单的编程,绘制出神一般的的矩阵散点图。矩阵散点图这个东西,第一次看到就把我惊呆了。在那之前我见过的散点图只是两坐标或者三坐标上面标注点,绝大多数情况下我只看到过两坐标的。我们大都从点的分布,点的密度,点的聚集模式得出一些规律,找到一些结论。这是以前我一直在做的,我也只看到别人做到了那个程度,但在今年夏天我学习的那本数据分析里面,他们用两维数据作出一个散点图,在用第三维数据对比N个散点图。这些矩阵散点图是一次性做出来的,并不需要一个个的手动合并,而且那些散点图也不需要手工去设行列数。你只需要提出处理数据的要求,他们就会选择最佳的方式表达出来。第一次看到那个的时候,我觉得那简直是屌爆了!前几天我也尝试过用我的数据做矩阵散点图。后来发现,别说散点图,即便是要我提供一个能正确读取数据的csv文件好像也很麻烦。昨天中午,当我把一个一个Excel做出来的散点图罗列堆砌到Word里的时候,我明白到如果只是一两个,没问题,但我需要2个散点图一起做对比,4个散点图一并罗列出来找差异,显然只能使用矩阵散点图的方式,而不能一个一个贴浪费篇幅且让人疲劳。

在学习数据分析那本书的时候,虽然我也用过R语言,但是那纯粹是把书本上的命令行抄写过去,我完全没有动脑筋,所以当我把自己的数据放到R语言里面处理,希望得到我想要的东西的时候,无论我怎么纠结,貌似都得不出我想要的东西。在奋斗了几个小时以后,我才发现原来plot跟xyplot是两个完全不一样东西。plot是R语言的一个原生作图函数,xyplot则需要调用lattice数据包。数据包就像是一个插件,不过lattice那个插件已经常规到已经默认安装在R语言的主体软件里。在折腾的时候,我因为发现plot函数xyplot函数得出来的图不一样,我才明白到了这点。最明显的区别是他俩的图形颜色不一样,坐标轴的字体不一样,以及坐标轴的刻度分布不一样。我个人觉得lattice数据包作出来的图要比R语言原生的好看一些。

昨天我足足折腾了接近12个小时,才稍微得到了我想要的东西。之所以说稍微,是因为某些因素我还不能自如控制,有些参数我纯粹只是停留在猜想的层面。我不能满足自己只知道一些。我也知道有一些轻量级的作图软件大概也可以做到我想要的功能,但既然R语言如此强大,我愿意花更多的时间去认识他拥抱他。

用编程的方式去作图,想想都觉得这实在太牛逼了。于是,昨天晚上我也定下了目标,2020年我要加把劲学习R语言。

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