Python各类图形绘制—turtle与Matplotlib-22、计算三角形阴影面积大小
目录
Python各类图形绘制—turtle与Matplotlib-22、计算三角形阴影面积大小
前言
既然是学习数学,肯定会离不开各种图形,之前的文章中很多我都尽可能的不使用图来表示了,但是觉得不好,毕竟数学离开了图就会很抽象,所以我们这里单独的学习一下Python的各类图形绘制,包含绘制切线什么的,这样在数学学习的图像处理上就会好很多。
编号 | 中文名称 | 英文名称 | 图形说明 |
---|---|---|---|
1 | 点 | Point | 几何中最基本元素,无大小、长度、宽度、高度,仅表示位置,二维平面用坐标 (x, y) 确定位置 |
2 | 线段 | Line Segment | 直线上两点间的有限部分,有两个端点,可确定长度,由两端点坐标确定位置和长度 |
3 | 射线 | Ray | 由线段一端无限延长形成,有一个端点,另一端无限延伸,不可测量长度 |
4 | 直线 | Line | 没有端点,可向两端无限延伸,不可度量长度,平面直角坐标系中可用线性方程表示 |
5 | 角 | Angle | 由两条有公共端点的射线组成,公共端点是顶点,两条射线是边,用度数衡量大小 |
6 | 三角形 | Triangle | 同一平面内不在同一直线上的三条线段首尾顺次连接组成的封闭图形。按边分有等边(三边相等)、等腰(至少两边相等)、不等边三角形;按角分有锐角(三角皆锐角)、直角(一角为直角)、钝角(一角为钝角)三角形 |
7 | 四边形 | Quadrilateral | 由不在同一直线上的四条线段依次首尾相接围成的封闭的平面图形或立体图形。常见的有平行四边形(两组对边分别平行)、矩形(四个角为直角的平行四边形)、菱形(四条边相等的平行四边形)、正方形(四个角为直角且四条边相等的平行四边形)、梯形(一组对边平行,另一组对边不平行)等 |
8 | 五边形 | Pentagon | 由五条线段首尾相连组成的封闭图形,内角和为 540 度,正五边形五条边相等,五个角也相等 |
9 | 六边形 | Hexagon | 由六条线段首尾相连围成的封闭图形,内角和为 720 度,正六边形六条边相等,六个内角也相等,每个内角为 120 度 |
10 | 圆形 | Circle | 平面上到定点的距离等于定长的所有点组成的图形,定点称为圆心,定长称为半径。圆是轴对称图形,也是中心对称图形 |
11 | 椭圆 | Ellipse | 平面内到两个定点的距离之和等于常数(大于两定点间距离)的点的轨迹,这两个定点叫做椭圆的焦点,两焦点间的距离叫做焦距 |
12 | 扇形 | Sector | 一条圆弧和经过这条圆弧两端的两条半径所围成的图形,扇形面积与圆心角(顶角)、圆半径相关 |
13 | 弓形 | Segment of a circle | 由弦及其所对的弧组成的图形,可分为劣弧弓形(小于半圆)和优弧弓形(大于半圆) |
开发环境
系统:win11
开发语言:Python
使用工具:Jupyter Notebook
使用库:turtle与Matplotlib
turtle_demo
代码示例:
import turtle
# 大三角形参数
side_length = 240 # 增大尺寸使图形更清晰
h = (3**0.5/2) * side_length
# 创建绘图用的turtle
drawer = turtle.Turtle()
drawer.speed(0)
drawer.hideturtle()
# 改进后的标准绘图流程
def draw_triangle(t, start_pos, length, color):
"""标准三角形绘制函数"""
t.penup()
t.goto(start_pos)
t.setheading(0) # 确保朝向统一
t.pendown()
t.pencolor(color)
for _ in range(3):
t.forward(length)
t.left(120)
# 绘制大三角形(蓝色虚线辅助线)
drawer.pensize(1)
draw_triangle(drawer, (-side_length/2, -h/2), side_length, "blue")
drawer.penup()
# 改进的阴影绘制逻辑
shade_length = side_length / 3 # 修改为三等分
for i in range(3):
x = -side_length/2 + i*shade_length
y = -h/2 + (i%2)*(h/2) # 交错高度
drawer.goto(x, y)
drawer.begin_fill()
drawer.fillcolor('gray')
draw_triangle(drawer, (x, y), shade_length, "black")
drawer.end_fill()
# 添加精确标注
measure = turtle.Turtle() # 新建标注专用画笔
measure.hideturtle()
measure.pencolor("red")
# 绘制大三角形标注线
measure.penup()
measure.goto(-side_length/2, -h/2-40)
measure.pendown()
measure.write(f"主三角形边长: {side_length}单位", align="left", font=("宋体", 12, "bold"))
# 更新后的解题步骤
steps = [
"解题步骤:",
"1. 主三角形面积 = (a²√3)/4",
f" = ({side_length}²×1.732)/4 ≈ {side_length**2*3**0.5/4:.1f}",
"2. 阴影区包含3个全等三角形",
f" 每个小三角形边长: {shade_length}单位",
"3. 总面积 = 主面积 × 3×(1/3)² = 主面积 × 1/3",
f"最终面积 ≈ {side_length**2*3**0.5/4/3:.1f}平方单位"
]
# 改进的步骤显示位置
text_turtle = turtle.Turtle()
text_turtle.hideturtle()
text_turtle.penup()
text_turtle.goto(turtle.window_width()/2 - 220, turtle.window_height()/2 - 50) # 更高起始位置
for step in steps:
text_turtle.write(step, align="right", font=("楷体", 14, "normal"))
text_turtle.sety(text_turtle.ycor() - 30)
turtle.done()
效果示例:
Matplotlib_demo
代码示例:
import matplotlib.pyplot as plt
import numpy as np
# 参数设置
side_length = 240
h = (3**0.5/2) * side_length
# 创建画布
fig, ax = plt.subplots(figsize=(10, 8))
ax.set_aspect('equal')
ax.axis('off')
# 主三角形顶点坐标
main_tri = np.array([[-side_length/2, -h/2],
[side_length/2, -h/2],
[0, h/2],
[-side_length/2, -h/2]])
# 绘制主三角形(蓝色虚线边框)
ax.plot(main_tri[:,0], main_tri[:,1], 'b--', linewidth=1)
# 绘制三个阴影小三角形
shade_length = side_length / 3
for i in range(3):
x = -side_length/2 + i*shade_length
y = -h/2 + (i%2)*(h/2)
# 小三角形顶点坐标
small_tri = np.array([[x, y],
[x + shade_length, y],
[x + shade_length/2, y + (3**0.5/2)*shade_length],
[x, y]])
ax.fill(small_tri[:,0], small_tri[:,1], 'gray')
# 添加主三角形标注
ax.text(-side_length/2, -h/2-40, f"主三角形边长: {side_length}单位",
color='red', fontsize=12, fontfamily='SimSun', fontweight='bold')
# 添加解题步骤
steps = [
"解题步骤:",
"1. 主三角形面积 = (a²√3)/4",
f" = ({side_length}²×1.732)/4 ≈ {side_length**2*3**0.5/4:.1f}",
"2. 阴影区包含3个全等三角形",
f" 每个小三角形边长: {shade_length}单位",
"3. 总面积 = 主面积 × 3×(1/3)² = 主面积 × 1/3",
f"最终面积 ≈ {side_length**2*3**0.5/4/3:.1f}平方单位"
]
# 在右上角显示步骤
step_text = '\n'.join(steps)
ax.text(0.95, 0.85, step_text, transform=ax.transAxes,
fontsize=14, fontfamily='KaiTi',
verticalalignment='top', horizontalalignment='right')
plt.show()
效果示例: