第二十八 几何
几何(Geometry)是数学中最古老的分支之一,研究空间中点、线、面、体的形状、大小、位置关系以及变换规律。坐标系的出现将代数与几何连接在一起,使我们能够用方程描述几何图形,用计算解决几何问题。
一、基本几何图形
几何研究的对象可以从维度来分类:
| 维度 | 对象 | 示例 |
|---|---|---|
| 0 维 | 点 | 坐标点 (x, y) |
| 1 维 | 线 | 直线、曲线、抛物线、双曲线 |
| 2 维 | 面 | 三角形、矩形、圆、椭圆 |
| 3 维 | 体 | 正方体、圆柱体、球、圆锥 |
二、平面几何公式
2.1 三角形
面积公式(已知两边和夹角):
$$S = \frac{1}{2}ab\sin\theta$$
海伦公式(已知三边长):
$$S = \sqrt{p(p-a)(p-b)(p-c)} \quad \left(p = \frac{a+b+c}{2}\right)$$
fn triangle_area_sides(a: f64, b: f64, c: f64) -> f64 {
let p = (a + b + c) / 2.0;
(p * (p - a) * (p - b) * (p - c)).sqrt()
}
fn triangle_area_angle(a: f64, b: f64, angle_rad: f64) -> f64 {
0.5 * a * b * angle_rad.sin()
}
fn main() {
// 海伦公式:边长为 3, 4, 5 的三角形
let area = triangle_area_sides(3.0, 4.0, 5.0);
println!("海伦公式: 面积 = {}", area); // 6.0
// 两边夹角:边长 3 和 4,夹角 90°
let area2 = triangle_area_angle(3.0, 4.0, std::f64::consts::FRAC_PI_2);
println!("两边夹角: 面积 = {}", area2); // 6.0
}
2.2 四边形
| 图形 | 面积公式 | 周长公式 |
|---|---|---|
| 矩形 | $S = ab$ | $C = 2(a+b)$ |
| 正方形 | $S = a^2$ | $C = 4a$ |
| 平行四边形 | $S = ah$($h$ 为高) | $C = 2(a+b)$ |
| 梯形 | $S = \frac{1}{2}(a+b)h$ | — |
2.3 圆
面积: $S = \pi r^2$
周长: $C = 2\pi r$
2.4 扇形
面积: $S = \frac{1}{2}r^2\theta$($\theta$ 为弧度)
弧长: $l = r\theta$
2.5 椭圆
标准方程: $\frac{x^2}{a^2} + \frac{y^2}{b^2} = 1 \quad (a > 0, b > 0)$
面积: $S = \pi ab$
周长(拉马努金第二近似公式):
$$ L \approx \pi(a + b)\left(1 + \frac{3h}{10 + \sqrt{4 - 3h}}\right) \quad h = \frac{(a-b)^2}{(a+b)^2} $$
fn ellipse_area(a: f64, b: f64) -> f64 {
std::f64::consts::PI * a * b
}
fn ellipse_perimeter(a: f64, b: f64) -> f64 {
let h = ((a - b) * (a - b)) / ((a + b) * (a + b));
std::f64::consts::PI * (a + b) * (1.0 + 3.0 * h / (10.0 + (4.0 - 3.0 * h).sqrt()))
}
fn main() {
let a = 5.0;
let b = 3.0;
println!("椭圆面积: {:.4}", ellipse_area(a, b)); // 47.1239
println!("椭圆周长: {:.4}", ellipse_perimeter(a, b)); // ≈ 25.5267
}
三、立体几何公式
| 图形 | 体积公式 | 表面积公式 |
|---|---|---|
| 正方体 | $V = a^3$ | $S = 6a^2$ |
| 长方体 | $V = abc$ | $S = 2(ab+bc+ac)$ |
| 圆柱体 | $V = \pi r^2 h$ | $S = 2\pi r(r+h)$ |
| 圆锥体 | $V = \frac{1}{3}\pi r^2 h$ | $S = \pi r(r+l)$($l$ 为母线长) |
| 球体 | $V = \frac{4}{3}\pi r^3$ | $S = 4\pi r^2$ |
use std::f64::consts::PI;
fn sphere_volume(r: f64) -> f64 {
4.0 / 3.0 * PI * r.powi(3)
}
fn sphere_surface(r: f64) -> f64 {
4.0 * PI * r.powi(2)
}
fn cylinder_volume(r: f64, h: f64) -> f64 {
PI * r.powi(2) * h
}
fn cone_volume(r: f64, h: f64) -> f64 {
1.0 / 3.0 * PI * r.powi(2) * h
}
fn main() {
let r = 5.0;
println!("球体体积 (r=5): {:.4}", sphere_volume(r)); // 523.5988
println!("球体表面积 (r=5): {:.4}", sphere_surface(r)); // 314.1593
println!("圆柱体体积 (r=3, h=10): {:.4}", cylinder_volume(3.0, 10.0)); // 282.7433
println!("圆锥体体积 (r=3, h=10): {:.4}", cone_volume(3.0, 10.0)); // 94.2478
}
四、坐标系——连接代数和几何的桥梁
坐标系是连接代数和几何的桥梁。通过坐标系,我们可以用代数方程描述几何图形,用计算方法解决几何问题。
4.1 直线
一般式: $ax + by + c = 0$
斜截式: $y = mx + b$($m$ 为斜率,$b$ 为 y 轴截距)
点斜式: $y - y_0 = m(x - x_0)$
点到直线的距离:
$$ d = \frac{|ax_0 + by_0 + c|}{\sqrt{a^2 + b^2}} $$
fn point_to_line_distance(px: f64, py: f64, a: f64, b: f64, c: f64) -> f64 {
(a * px + b * py + c).abs() / (a * a + b * b).sqrt()
}
fn main() {
// 点 (1, 2) 到直线 3x + 4y + 5 = 0 的距离
let d = point_to_line_distance(1.0, 2.0, 3.0, 4.0, 5.0);
println!("点到直线的距离: {:.4}", d); // 3.6
}
4.2 圆
标准方程: $(x - h)^2 + (y - k)^2 = r^2$
其中 $(h, k)$ 为圆心,$r$ 为半径。
4.3 抛物线
标准方程: $y = ax^2 + bx + c \quad (a \neq 0)$
顶点坐标: $\left(-\frac{b}{2a}, \frac{4ac - b^2}{4a}\right)$
开口方向: $a > 0$ 向上,$a < 0$ 向下
4.4 双曲线
$$ \frac{x^2}{a^2} - \frac{y^2}{b^2} = 1 \quad (a > 0, b > 0) $$
4.5 悬链线
悬链线是一条柔软、不可伸长的链条在重力作用下自然下垂所形成的曲线:
$$ y = a \cosh\left(\frac{x}{a}\right) = a \cdot \frac{e^{x/a} + e^{-x/a}}{2} \quad (a > 0) $$
悬链线不是抛物线!这是一个常见的误解。抛物线是抛射物体的轨迹,而悬链线是悬挂链条的形状。
4.6 椭圆曲线
椭圆曲线在密码学中有重要应用:
$$ y^2 = x^3 + ax + b $$
椭圆曲线上的点构成一个阿贝尔群,其上的离散对数问题(ECDLP)是椭圆曲线密码学(ECC)的安全基础。
五、几何变换
几何变换是线性代数在几何中的应用,通过矩阵乘法实现图形的变换。
5.1 常见变换
| 变换 | 矩阵 | 说明 |
|---|---|---|
| 旋转(Rotate) | $\begin{pmatrix} \cos\theta & -\sin\theta \ \sin\theta & \cos\theta \end{pmatrix}$ | 绕原点旋转角度 $\theta$ |
| 缩放(Scale) | $\begin{pmatrix} s_x & 0 \ 0 & s_y \end{pmatrix}$ | x 方向缩放 $s_x$ 倍,y 方向缩放 $s_y$ 倍 |
| 剪切(Shear) | $\begin{pmatrix} 1 & k \ 0 & 1 \end{pmatrix}$ | 水平剪切 |
| 反射(Reflect) | $\begin{pmatrix} -1 & 0 \ 0 & 1 \end{pmatrix}$ | 关于 y 轴对称 |
fn rotate_point(x: f64, y: f64, angle_rad: f64) -> (f64, f64) {
let cos_a = angle_rad.cos();
let sin_a = angle_rad.sin();
(x * cos_a - y * sin_a, x * sin_a + y * cos_a)
}
fn scale_point(x: f64, y: f64, sx: f64, sy: f64) -> (f64, f64) {
(x * sx, y * sy)
}
fn main() {
let (x, y) = (1.0, 0.0);
// 旋转 90°(π/2)
let (rx, ry) = rotate_point(x, y, std::f64::consts::FRAC_PI_2);
println!("旋转 90°: ({:.4}, {:.4})", rx, ry); // (0, 1)
// 旋转 45°(π/4)
let (rx, ry) = rotate_point(x, y, std::f64::consts::FRAC_PI_4);
println!("旋转 45°: ({:.4}, {:.4})", rx, ry); // (0.7071, 0.7071)
// 缩放 2 倍
let (sx, sy) = scale_point(x, y, 2.0, 2.0);
println!("缩放 2 倍: ({:.4}, {:.4})", sx, sy); // (2, 0)
}
5.2 行列式的几何意义
行列式的几何意义是矩阵变换后面积(或体积)的缩放倍数:
- $2 \times 2$ 矩阵的行列式 = 变换后的面积缩放倍数
- $3 \times 3$ 矩阵的行列式 = 变换后的体积缩放倍数
- 行列式为 0 表示变换后维度降低(如二维图形被压缩成一条线)
5.3 特征值与特征向量
特征值和特征向量描述了线性变换中“方向不变“的量:
$$ A\vec{v} = \lambda\vec{v} $$
其中 $\lambda$ 是特征值,$\vec{v}$ 是特征向量。特征值表示在该方向上的缩放倍数。
六、用 Rust 绘制几何图形
使用 plotters 库可以在 Rust 中绘制各种几何图形。
6.1 绘制抛物线
use plotters::prelude::*;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let root = BitMapBackend::new("plot.png", (640, 480)).into_drawing_area();
root.fill(&WHITE)?;
let mut chart = ChartBuilder::on(&root)
.caption("y = x²", ("sans-serif", 50).into_font())
.margin(5)
.x_label_area_size(30)
.y_label_area_size(30)
.build_cartesian_2d(-1f32..1f32, -0.1f32..1f32)?;
chart.configure_mesh().draw()?;
chart
.draw_series(LineSeries::new(
(-50..=50).map(|x| x as f32 / 50.0).map(|x| (x, x * x)),
&RED,
))?
.label("y = x²")
.legend(|(x, y)| PathElement::new(vec![(x, y), (x + 20, y)], &RED));
chart
.configure_series_labels()
.background_style(&WHITE.mix(0.8))
.border_style(&BLACK)
.draw()?;
root.present()?;
Ok(())
}
6.2 几何赏析
一些优美的数学曲线方程:
$$ \sin(x^2) = \sin(y^2) $$
更多 plotters 示例请参考 GitHub 仓库。
七、几何与代数的联系
几何直观可以帮助我们理解代数概念:
| 代数概念 | 几何直观 |
|---|---|
| 向量线性相关 | 向量指向同一方向或相反方向 |
| 向量线性无关 | 向量指向不同方向,张成空间 |
| 行列式 | 面积或体积的缩放倍数 |
| 逆矩阵 | 将变换“撤销“回去 |
| 列空间 | 变换后所有可能到达的位置 |
| 零空间 | 被压缩到原点的所有向量 |
| 秩(Rank) | 变换后空间的维数 |
| 特征值 | 在特定方向上的缩放倍数 |
| 特征向量 | 变换后方向不变的向量 |
推荐观看 3Blue1Brown - 线性代数的本质 系列,以几何直觉理解线性代数的核心概念。
八、学习资源
| 资源 | 说明 |
|---|---|
| 3Blue1Brown 官网 | 数学可视化讲解 |
| 3Blue1Brown B站 | 中文字幕版 |
| 微积分的本质 | 微积分可视化系列 |
| Desmos | 在线图形计算器 |
九、总结
| 主题 | 核心内容 |
|---|---|
| 平面几何 | 三角形、四边形、圆、椭圆的面积与周长公式 |
| 立体几何 | 球体、圆柱体、圆锥体的体积与表面积公式 |
| 坐标系 | 直线、圆、抛物线、双曲线、椭圆曲线的方程 |
| 几何变换 | 旋转、缩放、剪切、反射 |
| 线性代数与几何 | 行列式、特征值、秩的几何意义 |
几何是数学中最直观的分支。通过坐标系,代数与几何融为一体,使我们既能用方程精确描述图形,又能用图形直观理解方程。
练习建议:
- 用 Rust 实现点到直线的距离计算
- 用 plotters 绘制正弦曲线和余弦曲线
- 实现二维向量的旋转、缩放和反射变换