zoukankan      html  css  js  c++  java
  • Python绘制五角星等能一笔画出的角星

    只有奇数和4的整数倍的角星才能一笔画出,见程序和注释:

    多画几种情况认真分析,注意到辅助线对角的等分是绝对的,与边的垂直是特殊的.

    奇数角星小角360/(2n),偶数角星小角360/n.可按此公式画出任意角星,但只有一笔能画出的角星比较美观,有一气呵成之美.

    n=2k 但不是n!=4k的角星可由两个k角星旋转得到,相位差360/n.旋转时注意区分n和k.

    import math
    import turtle as t
    
    #这种方法只能画只在尖角处转向就可以画出的角星,
    # 即可以用等长线段(线段长度为不转弯的最大)不提笔画完的角星
    #如注释吊28,29行,则偶数角数变为原来2倍,证明此方法只能画奇数和4的整数倍的角星
    #即只有奇数和4的整数倍的角星才能一笔画出
    
    def loop(r,n):
        t.fd(ol(r,n))
        t.right(180-360/(2*n))
    
    def ol(r,n):
        na = (360/(4*n)) / 180 * math.pi
        ol = r * math.cos(na) * 2
        ol = int(round(ol))
        return ol
    
    def relocation(r,n):
        t.penup()
        t.left(90)
        t.fd(r)
        t.right(180 - 360/(4*n))
        t.pendown()
    
    def main(r,n):
        times=n
        if n==1 or n==2:
            print('error input')
            exit()
        elif n%2==1:
            print('开始绘制...')
        elif n%2==0:
            n/=2
            if n%2==1:
                print('无法一笔画出{0:.0f}角星'.format(times))
                exit()
            else:
                print('开始绘制...')
        else:
            print('error input')
            exit()
        relocation(r,n)
        for i in range(times):
            loop(r,n)
        t.penup()
        t.goto(0,0)
        t.seth(0)
        t.pendown()
    
    r=200
    n=eval(input('请输入要绘制的角星的角数n,n需是>=3的整数:')) #eval()函数很重要,不要总忘记加!!!
    t.pensize(8)  #注意t.pensize(20)不是t.pensize=20,变量赋值采用=,属性更改用t.pensize(20)
    t.color('green')
    t.speed(10)
    t.setup(450,450)
    main(r,n)
    t.done()

    五角星和十六角星:

  • 相关阅读:
    小程序排错(redis导致)
    linux系统删除-开头文件或目录
    nginx 反向代理
    memcache
    一次故障过程
    json.Decoder vs json.Unmarshal
    ssl中间证书
    作业10:String类
    Angular6如何引入jQuery-knob
    OpenJdk源码下载
  • 原文地址:https://www.cnblogs.com/zhangziyan/p/9215226.html
Copyright © 2011-2022 走看看