前言
既然是学习数学,肯定会离不开各种图形,之前的文章中很多我都尽可能的不使用图来表示了,但是觉得不好,毕竟数学离开了图就会很抽象,所以我们这里单独的学习一下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
绘制库说明
1. 功能和用途
-
Turtledrawn:
- 基于海龟绘图API(如
turtle
模块),专注于绘制简单的图形。 - 适合教育用途、复杂结构清晰的数据可视化或快速原型设计。
- 基于海龟绘图API(如
-
Matplotlib:
- 提供广泛的图表类型,支持科学数据可视化和自定义绘图。
- 支持复杂的样式设置,适合需要详细控制的图表显示。
2. 绘图风格和技术细节
-
Turtledrawn:
- 使用简单的命令绘制图形,生成结构明确、线条流畅的图像。
- 绘制方式较为直白,没有高级选项如颜色调整或标签自定义。
-
Matplotlib:
- 提供丰富的绘图功能,支持多种图表类型(折线图、柱状图、饼图等)。
- 具备高自定义能力,允许设置颜色、样式、标签和注释等细节。
3. 安装与使用
-
Turtledrawn:
- 使用
turtle
模块,调用特定函数绘制图形。 - 适合快速生成结构清晰的图像,无需复杂的配置。
- 使用
-
Matplotlib:
- 常见于交互式环境(如PyCharm或Jupyter Notebook)。
- 需要导入
pyplot
模块,提供了更多高级功能和绘图选项。
4. 性能
-
Turtledrawn:
- 绘制图形可能不如matplotlib高效,特别是在处理复杂图形时表现较慢。
-
Matplotlib:
- 由于生成图片文件,性能通常优于turtledrawn,尤其在绘制大量数据点时表现更好。
选择说明
- Turtledrawn适合:需要简单、结构明确的图形绘制,适用于教育或快速原型设计。
- Matplotlib适合:复杂图表和详细自定义需求,适合科学数据可视化。
选择哪个库取决于具体项目需求。如果需要快速生成结构清晰的图形,turtle是不错的选择;而matplotlib则更适合复杂的可视化任务。
使用Python说明
C++绘图说明-其中库需要单独写篇文章
#include <SFML/Graphics.hpp>
#include <SFML/Font.hpp>
int main() {
// 设置窗口大小和背景颜色
sf::RenderWindow window(sf::VideoMode(800, 600), "等腰三角形");
sf::RenderWindow::WindowProperties props;
window.setProperties(&props);
// 设置背景为提夫尼蓝(比如#0099ff)
sf::Image background(props.size());
background.setColor(sf::Color(0x00, 0x99, 0xff));
background.draw();
sf::RenderWindow window2D(window);
// 定义三角形的三个顶点
float vertices[3][2];
vertices[0][0] = -75; vertices[0][1] = 40; // 底边左端点,假设底边长度为5cm
vertices[1][0] = 80; vertices[1][1] = 35; // 右侧腰端点
vertices[2][0] = -75; vertices[2][1] = 140; // 左侧腰端点
// 绘制边框
sf::LineStrip line;
line.addVertex(vertices[0]);
line.addVertex(vertices[1]);
line.addVertex(vertices[2]);
line.addVertex(vertices[0]); // 关闭多段线
sf::LineStripOptions options;
options closing = true;
sf::Image edgeFill(sf::Color(255, 255, 255));
edgeFill blurred(8);
window2D.draw(&line, &edgeFill, options);
// 定义点阵参数
float points[] = {7.0f, 5.0f}; // 边长
// 计算角度
// 使用向量计算角度(这里简化)
double angle1 = calculateAngle(5.0, 7.0, 7.0); // 底角1
double angle2 = calculateAngle(5.0, 7.0, 7.0); // 底角2,与angle1相同
double angle3 = M_PI * 2.0 - (angle1 + angle2); // 顶角
// 标记边长
sf::Font font("Arial", 18);
sf::String bottomSide(5.0f, vertices[0][0] + 50, vertices[0][1]);
string textBottom;
sf::String topSide(7.0f, vertices[1][0] - 20, vertices[1][1] - 40);
string textTop;
sf::String rightSide(7.0f, vertices[2][0] + 30, vertices[2][1] - 40);
string textRight;
// 标记角度
sf::String angleBottomLeft(angle3 * 180 / M_PI, vertices[0][0], vertices[0][1]);
sf::String angleBottomRight(angle1 * 180 / M_PI, vertices[2][0] + 50, vertices[2][1]);
//渲染窗口
window2D.render();
return 0;
}
使用Python绘图说明
绘制基础图形:
import math
import turtle
# 设置背景颜色为提夫尼蓝
screen = turtle.Screen()
screen.bgcolor("#009EEA")
# 创建一个Turtle对象
t = turtle.Turtle()
t.speed(1) # 设置绘制速度,数值越大越慢
t.pensize(3) # 设置线宽
# 计算三角形的角度
base_length = 120 # 底边长度(单位:m)
side_length = 200 # 腰长(单位:m)
# 使用余弦定理计算角度
angle_radians = math.acos((2 * side_length ** 2 - base_length ** 2) / (2 * side_length ** 2))
angle_degrees = math.degrees(angle_radians)
base_angle = (180 - angle_degrees) / 2
# 绘制等腰三角形
t.forward(side_length) # 绘制第一条腰
t.left(180 - base_angle) # 转向
t.forward(base_length) # 绘制底边
t.left(180 - base_angle) # 转向
t.forward(side_length) # 绘制第二条腰
# 标注边长
t.penup()
t.goto(side_length / 2, 0) # 移动到第一条腰的中点
t.pendown()
t.write(f"{side_length} cm", align="center", font=("Arial", 12, "normal")) # 标注第一条腰的长度
t.penup()
t.goto(base_length / 2, -side_length / 2) # 移动到底边的中点
t.pendown()
t.write(f"{base_length} cm", align="center", font=("Arial", 12, "normal")) # 标注底边的长度
# 标注角度
t.penup()
t.goto(side_length / 4, side_length / 4) # 移动到顶角的位置
t.pendown()
t.write(f"{round(angle_degrees, 2)}°", align="center", font=("Arial", 12, "normal")) # 标注顶角的角度
t.penup()
t.goto(base_length / 4, -side_length / 4) # 移动到底角的位置
t.pendown()
t.write(f"{round(base_angle, 2)}°", align="center", font=("Arial", 12, "normal")) # 标注底角的角度
# 隐藏画笔
t.hideturtle()
# 保持窗口打开
turtle.done()
使用matplotlib库绘制效果
import matplotlib.pyplot as plt
import numpy as np
# 设置背景颜色为提夫尼蓝
plt.figure(facecolor='#009EEA')
# 等腰三角形的边长
side_length = 7 # 腰长(单位:cm)
base_length = 5 # 底边长度(单位:cm)
# 计算角度
angle_radians = np.arccos((2 * side_length ** 2 - base_length ** 2) / (2 * side_length ** 2))
angle_degrees = np.degrees(angle_radians)
base_angle = (180 - angle_degrees) / 2
# 三角形的顶点坐标
A = np.array([0, 0])
B = np.array([side_length, 0])
C = np.array([side_length / 2, np.sqrt(side_length ** 2 - (side_length / 2) ** 2)])
# 绘制三角形
triangle = plt.Polygon([A, B, C], fill=None, edgecolor='black')
plt.gca().add_patch(triangle)
# 标注边长
plt.text((A[0] + B[0]) / 2, (A[1] + B[1]) / 2, f"{side_length} cm", ha='center', va='bottom')
plt.text((B[0] + C[0]) / 2, (B[1] + C[1]) / 2, f"{side_length} cm", ha='center', va='bottom')
plt.text((C[0] + A[0]) / 2, (C[1] + A[1]) / 2, f"{base_length} cm", ha='center', va='bottom')
# 标注角度
plt.text(A[0] + 0.5, A[1] + 0.5, f"{round(angle_degrees, 2)}°", ha='center', va='bottom')
plt.text(B[0] - 0.5, B[1] + 0.5, f"{round(angle_degrees, 2)}°", ha='center', va='bottom')
plt.text(C[0], C[1] + 0.5, f"{round(base_angle, 2)}°", ha='center', va='bottom')
# 设置坐标轴范围
plt.xlim(-1, side_length + 1)
plt.ylim(-1, C[1] + 1)
# 隐藏坐标轴
plt.axis('off')
# 显示图形
plt.show()