Ellipsoid Normal Sections & Geodesic — Interactive 3D Visualization
交互式三维可视化旋转椭球面上的法截面 (normal section)、法截弧 (normal section curve) 和大地线 (geodesic),帮助直观理解大地测量学中这三个核心概念的几何关系。
P1 和 P2 处椭球面法线方向不同
↓
两个法截面是不同的平面
↓
两条法截弧不重合 (正法截弧 ≠ 反法截弧)
↓
大地线介于两条法截弧之间
| 概念 | 英文 | 定义 |
|---|---|---|
| 法截面 | Normal section plane | 包含椭球面上某点法线的平面 |
| 法截弧 | Normal section curve | 法截面与椭球面的交线(椭圆) |
| 大地线 | Geodesic | 椭球面上两点间的最短路径 |
关键区别:在球面上,法线恒指向球心,两点间的正反法截弧重合(都是大圆弧)。在椭球面上,法线不指向椭球中心,正反法截弧是不同的曲线,大地线介于两者之间。
运行后将看到:
- 半透明椭球面(可调透明度)
- P1 (红点) 与 P2 (绿点) 两点
- 虚线:椭球中心到表面点的径向线
- 实线:表面法线(明显偏离径向线)
- 红色椭圆:过 P1 法线的完整法截弧
- 绿色椭圆:过 P2 法线的完整法截弧
- 金色粗线:P1↔P2 大地线(最短路径)
- 左侧文字框:几何原理解释
# 克隆仓库
git clone https://github.com/YOUR_USERNAME/ellipsoid-visualizer.git
cd ellipsoid-visualizer
# 安装依赖 (推荐使用国内镜像)
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn| 包 | 用途 |
|---|---|
numpy |
向量/矩阵运算 |
scipy |
ODE 数值积分(大地线打靶法) |
matplotlib |
3D 交互式绘图 |
geographiclib |
精确大地线计算(Karney 算法) |
# 默认参数 (高度夸大扁率 f=1/3,差异肉眼可见)
python ellipsoid_visualizer.py
# 中等夸大扁率
python ellipsoid_visualizer.py --f 10
# 真实 WGS84 椭球 (地球参数,法截弧差异极微小)
python ellipsoid_visualizer.py --f 298.257
# 球面模型 (法截弧 = 大地线 = 大圆弧)
python ellipsoid_visualizer.py --sphere
# 自定义椭球参数
python ellipsoid_visualizer.py --a 6378245 --b 6356863
# 自定义两点坐标
python ellipsoid_visualizer.py --B1 45 --L1 0 --B2 -30 --L2 80
# 保存为图片 (非交互模式)
python ellipsoid_visualizer.py --output figure.png| 控件 | 功能 |
|---|---|
| B1/L1/B2/L2 滑块 | 拖动调整两点经纬度 |
| 透明度滑块 | 调节椭球面不透明度 (0.02~0.80) |
| 复选框 | 开关法截弧/大地线/法截面/法线显示 |
| 鼠标拖拽 | 旋转/缩放三维视图 |
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--a |
float | 6378137 | 长半轴 (m) |
--f |
float | 3 | 扁率倒数 (3=高度夸大, 10=中等, 298.257=WGS84) |
--b |
float | — | 短半轴 (m),与 --f 二选一 |
--sphere |
flag | — | 球面模型 (R=6371 km) |
--B1 |
float | 60 | P1 大地纬度 (度) |
--L1 |
float | 0 | P1 大地经度 (度) |
--B2 |
float | 0 | P2 大地纬度 (度) |
--L2 |
float | 50 | P2 大地经度 (度) |
--output |
path | — | 输出图片路径 (非交互模式) |
--no-interactive |
flag | — | 非交互模式 (显示但不保存) |
地球椭球的扁率极小(f ≈ 1/298.257),肉眼几乎无法分辨椭球与球体的区别,法截弧与大地线的差异在屏幕分辨率下完全不可见。这是大地测量学的几何事实,而非程序缺陷。
教学上通过夸大扁率来展示三个概念的几何关系。运行 --f 298.257 可切换为真实地球参数,但两条法截弧将几乎完全重叠。
法截面由参考点 P、法线方向 n 和张成平面的正交基 {e₁, e₂} 定义。对平面内每条方向 d(θ),求解射线与椭球的交点:
(P + t·d)ᵀ D (P + t·d) = 1
→ t²(dᵀDd) + 2t(PᵀDd) = 0
→ t = −2(PᵀDd) / (dᵀDd)
其中 D = diag(1/a², 1/a², 1/b²) 为椭球二次型矩阵。
主路径:使用 geographiclib 的 Karney 算法(亚毫米精度)。
回退路径(geographiclib 未安装时):Clairaut 方程打靶法——
r · sin(α) = C (Clairaut 定理)
dλ/dβ = C·√(1−e²cos²β) / (cos²β·√(a²cos²β−C²))
通过 Brent 求根搜索使积分终点与目标经度一致的 Clairaut 常数 C。
ellipsoid-visualizer/
├── ellipsoid_visualizer.py # 主程序 (单文件)
├── requirements.txt # Python 依赖
├── LICENSE # MIT 许可证
├── README.md # 本文件
└── .gitignore # Git 忽略规则
MIT — 自由使用、修改和分发。
- 孔祥元, 郭际明, 刘宗泉. 《大地测量学基础》(第二版). 武汉大学出版社, 2010.
- Karney, C.F.F. Algorithms for geodesics. Journal of Geodesy, 2013.
- geographiclib documentation