Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第二十八 几何

几何(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在线图形计算器

九、总结

主题核心内容
平面几何三角形、四边形、圆、椭圆的面积与周长公式
立体几何球体、圆柱体、圆锥体的体积与表面积公式
坐标系直线、圆、抛物线、双曲线、椭圆曲线的方程
几何变换旋转、缩放、剪切、反射
线性代数与几何行列式、特征值、秩的几何意义

几何是数学中最直观的分支。通过坐标系,代数与几何融为一体,使我们既能用方程精确描述图形,又能用图形直观理解方程。

练习建议:

  1. 用 Rust 实现点到直线的距离计算
  2. 用 plotters 绘制正弦曲线和余弦曲线
  3. 实现二维向量的旋转、缩放和反射变换