金字塔(Python)

目录

前言

 源代码

正文

画草图

主体部分

水平条纹

竖直条纹

侧边条纹(未完成)

源代码

 总结


前言

来自大佬的评论,我刚开始还不知道是什么意思,这考完试之后就似懂非懂了,这不确实,把颜色一换,把文字删除,直接就是一篇博客了,简直是妙哉!!!

端午节粽子(python)_封奚泽优的博客-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/131338766?spm=1001.2014.3001.5501

 源代码

这里步骤就和粽子是一样的了,换了一个填充的颜色,删除了输出文字的代码。

大家看一下怎么搭配。

#金黄色
fillcolor("gold")
#沙棕色
fillcolor("sandybrown")
#黄褐色
fillcolor("khaki")
#巧克力色
fillcolor("chocolate")
#马鞍棕色
fillcolor("saddlebrown")
#秘鲁色
fillcolor("peru")
#深灰色
fillcolor("darkgray")
#石板灰
fillcolor("slategray")
#红褐色
fillcolor("maroon")
#深红色
fillcolor("darkred")
#靛蓝色
fillcolor("indigo")
#深蓝色
fillcolor("darkblue")
#翠绿色
fillcolor("teal")
#深绿色
fillcolor("darkgreen")
from turtle import *

# 画金字塔
# 将海龟笔尖提起
penup()
# 将海龟图形移动到画布上指定的位置(算是为了居中绘画吧)
goto(-100, -50)
# 将海龟笔尖落下
pendown()

# 画笔宽度
pensize(2)
# 画笔颜色
pencolor("black")
# 金字塔大体的填充色
fillcolor("gold")
# 开始填充
begin_fill()
# 绘制金字塔正面
for i in range(3):
    # forward,在当前位置方向移动一定的距离
    fd(200)
    # 画圆弧
    circle(15, 120)
# 绘制金字塔的侧面
fd(200)
circle(15, 60)
fd(100)
circle(15, 90)
fd(173)
circle(1, 90)
# 停止填充
end_fill()

# 将海龟笔尖提起
penup()
fd(100)
# 向右旋转60
right(60)
# 向后移动105
back(105)
# 表存当前的坐标点
a = pos()
pendown()

# 画笔颜色
color("black")
# 条纹的颜色
fillcolor("gold")
# 绘制正面的条纹
begin_fill()
fd(120)
goto(a)
# pen up调整位置
penup()
back(15)
left(90)
fd(20)
right(90)
pendown()
fd(150)
right(120)
fd(24)
right(60)
fd(120)
right(60)
fd(24)
end_fill()
# 侧面的条纹
begin_fill()
left(110)
fd(65)
left(100)
fd(24)
left(80)
fd(50)
# 结束填充
end_fill()

# 画下面的那条条纹
# 绘制正面的条纹
# 摆正他的方向
right(50)
# 得到a点的坐标
x, y = a
# 让a点坐标向右下靠
x = x + 30
y = y - 50
b = x, y
# 提起画笔把初始的位置什么设置好(角度和准备),此时不能填充
penup()
fd(120)
goto(b)
back(15)
left(90)
fd(20)
right(90)
# 配置好了之后就可以填充了
begin_fill()
pendown()
# 先画下面的直线
fd(210)
right(120)
# 右边的直线
fd(24)
right(60)
# 上面的直线
fd(180)
right(60)
# 左边的直线
fd(24)
end_fill()
# 侧面的条纹
begin_fill()
left(110)
fd(90)
left(100)
fd(24)
left(80)
fd(75)
# 结束填充
end_fill()

# 隐藏turtle图形(箭头)
hideturtle()

# 暂停程序,停止画笔绘制,但绘图窗体不关闭,直到用户关闭pythonTurtle图形化窗口为止
done()

正文

这怎么说呢,感觉这样也行吧,但是又感觉是少了一点什么,那个条纹不是很好看,要增加几条竖的直线。

这个边缘是圆弧,对于点也不是很好设计,于是我就重新设计了一个金字塔。

画草图

我首先就是先画一个草图,标一下点,确定一下坐标,为了简化一下他的难度,我设计的时候正面是一个等边三角形,侧面是一个等腰等腰三角形(其实侧面也可以是等边三角形,但是感觉不是很好看,我自己不是很喜欢),草图大概画个轮廓,有些东西是在不断修改的,然后我假设的是正面等边三角形的三个端点到原点的距离为x,其实这个怎么说呢,感觉还有点麻烦,因为是有负值,但是后面要算距离和画那个条纹,不过我为什么又要这样写呢,是为了让他整个尽量居中绘制

之后就可以计算各个点的坐标了,以及他应该前进的距离。为了方便侧面的等边三角形的角度也尽量特殊一点,不过这当然不需要我们计算了,Python有自己的库,直接调用cos()和sin()就行了,最开始我还是直接把x带入200化简的,但是后面感觉有点麻烦,感觉直接就带公式那种算了,全部用x来表示他的坐标和距离。

主体部分

 因为用草图了,再加上已经设计的不是很复杂,画三角形之前也学过了,更何况都是比较特殊的三角形,确定了偏转角度以及往前移动的距离之后就没有问题了。还有就是填充,填充的颜色大家可以根据自己的喜欢填吧,之前也推荐了几种颜色,我这里选择的金黄色。


from turtle import *
from math import *

# 画金字塔
# 将海龟笔尖提起
penup()
# 将海龟图形移动到画布上指定的位置(算是为了居中绘画吧)
goto(100*sqrt(3), -100)
# 将海龟笔尖落下
pendown()
# 画笔宽度
pensize(2)
# 画笔颜色
pencolor("black")
# 金字塔大体的填充色
fillcolor("gold")

#假设正面的三个端点到原点的距离为x
x=200.0
# 开始填充
begin_fill()
# 绘制金字塔的正面(等边三角形)
for i in range(3):
    #先拐弯
    left(120)
    # forward,在当前位置方向移动一定的距离
    fd(sqrt(3)*x)
#绘制金字塔的侧面(等腰三角形)
left(45)
#用的是弧度制cos75
fd(2*sqrt(3)*cos(75*pi/180)*x)
left(105)
fd(sqrt(3)*x)
left(150)
fd(sqrt(3)*x)

# 停止填充
end_fill()

水平条纹

画水平的线这个就很容易找到规律的,我是把他分成了六份,他最高点的坐标是(0,x),最低点的y坐标是-x/2(不是凭空编造的哈,是计算出来的),那他整个的长度就是3x/2,我分成了6份,也就是y=3x/4,2x/4,x/4,0,-x/4的取值,x的取值呢,我是从左边往右边绘制的,所以就是三角形正面图,左下的端点的x值,也乘以他的比例就行了。每次可以left(45)之后再right(45),因为我是循环实现的,(这个找规律真的找的的头大),所以每次循环前统一让他移动的角度保持水平

#绘制条纹(平行线)
#y坐标的规律
# 先调整位置为水平
left(60)
y=3*x/4
for i in range(1,6):
    # 将海龟笔尖提起
    penup()
    # 将海龟图形移动到画布上指定的位置
    goto(-sqrt(3)*x*i/12,y)
    #每次都需要更新y值
    y=y-1/4*x
    # 将海龟笔尖落下
    pendown()
    #朝前移动
    forward(sqrt(3)*x*i/6)
    #侧边
    left(45)
    forward(sqrt(3)*cos(75*pi/180)*x*i/3)
    #再调制水平
    right(45)

竖直条纹

这个竖直条纹感觉还是要的,不然他没有灵魂。这里用right(90)和left(90)虽然都可以吧,但是一个是朝下绘制,一个是朝上绘制的,我这里原本是朝右的,所以习惯来说要right(90)来调整,这里的要画的竖直距离其实是固定的,因为我们之前就是均分他所以他的距离是一个固定的值1/x,然后就是位置问题了,我最开始是想的是用随机数,确定他的范围,然后随机,这个绘制的个数不一样,从上往下应该逐渐增多的,因为他横条的长度不是一样的,后面为了简单,没错,为了简单一点,选择了按比例分配,第一行1/2,第二行1/3,2/3,……,长度确定了就是坐标的问题了,他的值是有正有负的,所以之后还要减去他长度本身的一半,为什么是一半呢,如果全部减去,那他整个就从y的正半轴移动到y的负半轴了,因为它是一个三角形,所以他移动不能移动一个固定的值,每一行移动的距离也不一样。

#绘制竖直的直线
#调整角度为竖直
right(90)
#高度h就是一个固定的值
h1=x/4
y=3*x/4
for i in range(1,6):
    for j in range(1,i+1):
        # 将海龟笔尖提起
        penup()
        # 将海龟图形移动到画布上指定的位置
        goto(sqrt(3) * x *i*j/(i+1)/6-sqrt(3)*x*i/12, y)
        # 将海龟笔尖落下
        pendown()
        forward(h1)
    # 每次都需要更新y值
    y = y - x / 4

侧边条纹(未完成)

这个能写也能写,最开始我是没有思路的,因为我正面的几个点都是有规律的,它是在一条水平直线上,然后感觉侧面完成不了,现在感觉其他成一个角度之后就可以转变了,因为它也是在一条直线上面,虽然不是水平,这里提供了他的固定长度,他y坐标搞定之后,x坐标可能也需要乘以一个角度,我感觉还是有点麻烦,就没有完成,大家可以自己实现一下哈。

h2=sqrt(3)*sin(75*pi/180)*x/6

源代码


from turtle import *
from math import *

# 画金字塔
# 将海龟笔尖提起
penup()
# 将海龟图形移动到画布上指定的位置(算是为了居中绘画吧)
goto(100*sqrt(3), -100)
# 将海龟笔尖落下
pendown()
# 画笔宽度
pensize(2)
# 画笔颜色
pencolor("black")
# 金字塔大体的填充色
fillcolor("gold")

#假设正面的三个端点到原点的距离为x
x=200.0
# 开始填充
begin_fill()
# 绘制金字塔的正面(等边三角形)
for i in range(3):
    #先拐弯
    left(120)
    # forward,在当前位置方向移动一定的距离
    fd(sqrt(3)*x)
#绘制金字塔的侧面(等腰三角形)
left(45)
#用的是弧度制cos75
fd(2*sqrt(3)*cos(75*pi/180)*x)
left(105)
fd(sqrt(3)*x)
left(150)
fd(sqrt(3)*x)

# 停止填充
end_fill()


#绘制条纹(平行线)
#y坐标的规律
# 先调整位置为水平
left(60)
y=3*x/4
for i in range(1,6):
    # 将海龟笔尖提起
    penup()
    # 将海龟图形移动到画布上指定的位置
    goto(-sqrt(3)*x*i/12,y)
    #每次都需要更新y值
    y=y-1/4*x
    # 将海龟笔尖落下
    pendown()
    #朝前移动
    forward(sqrt(3)*x*i/6)
    #侧边
    left(45)
    forward(sqrt(3)*cos(75*pi/180)*x*i/3)
    #再调制水平
    right(45)

#绘制竖直的直线
#调整角度为竖直
right(90)
#高度h就是一个固定的值
h1=x/4
y=3*x/4
for i in range(1,6):
    for j in range(1,i+1):
        # 将海龟笔尖提起
        penup()
        # 将海龟图形移动到画布上指定的位置
        goto(sqrt(3) * x *i*j/(i+1)/6-sqrt(3)*x*i/12, y)
        # 将海龟笔尖落下
        pendown()
        forward(h1)
    # 每次都需要更新y值
    y = y - x / 4
# 隐藏turtle图形(箭头)
hideturtle()
# 暂停程序,停止画笔绘制,但绘图窗体不关闭,直到用户关闭pythonTurtle图形化窗口为止
done()

 总结

把之前的想法实现了,可能也不是很像吧,但是已经把毕生所学都用上了,有些实现没有思路就没实现了,大家感兴趣可以再研究一下,那这到此结束了。

有感兴趣的小伙伴可以点赞多多支持一下哈。

如果有错误,也希望有大佬能够指出一下。

猜你喜欢

转载自blog.csdn.net/weixin_64066303/article/details/131513789