立体几何计算(functions/solids.py)
functions/solids.py 提供三维解析几何计算(点、直线、平面、空间向量、四面体,以及斜二测画法的投影与还原)。注意:本模块不包含球、圆柱、圆锥、棱柱、棱锥等立体的表面积 / 体积公式——这些由 UI 的「计算」等功能页以其他方式处理。对外主接口为 get_solids_result(字符串接口);另导出一批底层辅助函数,直接接收 sympy 三维几何对象(Point3D、Line3D、Plane 等)。
Note
若只想按字符串调用,请用 get_solids_result;下列辅助函数适用于编程组合三维几何对象的场景。UI 的「立体几何」定义页与「立体几何计算」页分别使用本模块的构造 / 计算函数。
get_solids_result — 统一调度(字符串接口)
作用:根据 op_index 调用对应的三维几何计算,参数为字符串,内部自动解析。
def get_solids_result(op_index, params, fs):
...
| 参数 | 类型 | 含义 |
|---|---|---|
op_index |
int |
操作编号,对应 solids_operation_list(0–36) |
params |
list[str] |
参数列表:点用 "x,y,z",多个点用 ";" 分隔;向量分量等按项填写 |
fs |
dict |
函数字典 |
返回:计算结果(sympy 表达式 / 坐标元组 / 字符串);参数非法时返回 "计算错误: ..."。
操作列表 solids_operation_list
solids_operation_list 是长度为 37 的字符串列表,索引与 op_index 一一对应:
| 索引 | 操作 | 索引 | 操作 |
|---|---|---|---|
| 0 | 两点距离 | 19 | 直线在平面投影 |
| 1 | 中点坐标 | 20 | 平面包含点 |
| 2 | 点到平面距离 | 21 | 平面包含直线 |
| 3 | 点到直线距离 | 22 | 四面体体积 |
| 4 | 点在平面投影 | 23 | 两点三维向量 |
| 5 | 点在直线投影 | 24 | 向量模(3D) |
| 6 | 共面判断 | 25 | 向量点积(3D) |
| 7 | 直线方向向量 | 26 | 向量叉积(3D) |
| 8 | 两直线交点 | 27 | 向量夹角(3D) |
| 9 | 两直线夹角 | 28 | 直线与平面夹角 |
| 10 | 平行判断(线) | 29 | 斜二测投影(单点) |
| 11 | 垂直判断(线) | 30 | 斜二测投影(多点) |
| 12 | 三点求平面方程 | 31 | 斜二测逆变换 |
| 13 | 平面的法向量 | 32 | 面积缩放比 |
| 14 | 两平面夹角 | 33 | 投影面积求原面积 |
| 15 | 平行判断(面) | 34 | 原面积求投影面积 |
| 16 | 垂直判断(面) | 35 | y方向长度恢复因子 |
| 17 | 两平面交线 | 36 | y方向投影长度 |
| 18 | 平面与直线交点 |
Note
UI「立体几何计算」页提供其中 22 种常用运算(点、线、面、向量、四面体等),内部调用下方对应的底层函数。
几何对象构造(定义页使用)
create_point3d(x: str, y: str, z: str, fs: dict) -> Point3D
作用:由坐标字符串构造三维点。
create_line3d(pt1: Point3D, pt2: Point3D) -> Line3D
作用:过两点构造三维直线。
create_plane_three_points(p1: Point3D, p2: Point3D, p3: Point3D) -> Plane
作用:过三点构造平面。
create_plane_point_normal(pt: Point3D, nx: str, ny: str, nz: str, fs: dict) -> Plane
作用:由一点与法向量分量字符串构造平面。
底层辅助函数
Note
以下函数接收 sympy 三维几何对象(Point3D/Line3D/Plane,来自 sympy.geometry),radsimp 化简后返回表达式或坐标元组。
点运算
point3d_distance(pt1: Point3D, pt2: Point3D) -> Expr
作用:两点三维距离。
point3d_midpoint(pt1: Point3D, pt2: Point3D) -> tuple[Expr, Expr, Expr]
作用:三维中点坐标 (x, y, z)。
point3d_to_plane_distance(pt: Point3D, plane: Plane) -> Expr
作用:点到平面的距离。
point3d_to_line_distance(pt: Point3D, line: Line3D) -> Expr
作用:点到三维直线的距离。
point3d_projection_on_plane(pt: Point3D, plane: Plane) -> tuple[Expr, Expr, Expr]
作用:点在平面上的投影坐标。
point3d_projection_on_line(pt: Point3D, line: Line3D) -> tuple[Expr, Expr, Expr]
作用:点在直线上的投影坐标。
are_coplanar(points: list[Point3D]) -> bool
作用:判断多个点是否共面(通常至少 4 点才有意义)。
直线运算
line3d_direction(line: Line3D) -> tuple[Expr, Expr, Expr]
作用:直线的方向向量 (dx, dy, dz)。
line3d_intersection(l1: Line3D, l2: Line3D) -> tuple | str
作用:两直线交点;不相交返回 "两直线不相交",重合返回 "两直线重合"。
line3d_angle(l1: Line3D, l2: Line3D) -> Expr
作用:两直线夹角(锐角,弧度)。
line3d_parallel_check(l1: Line3D, l2: Line3D) -> bool
作用:判断两直线是否平行。
line3d_perpendicular_check(l1: Line3D, l2: Line3D) -> bool
作用:判断两直线是否垂直。
line3d_projection_on_plane(line: Line3D, plane: Plane) -> tuple | str
作用:直线在平面上的投影(方向向量与一点,或投影为一点时的描述)。
平面运算
plane_equation_from_points(p1: Point3D, p2: Point3D, p3: Point3D) -> Expr
作用:过三点求平面方程。
plane_normal_vector(plane: Plane) -> tuple[Expr, Expr, Expr]
作用:平面的法向量 (nx, ny, nz)。
plane_angle_between(pl1: Plane, pl2: Plane) -> Expr
作用:两平面夹角(锐角,弧度)。
plane_parallel_check(pl1: Plane, pl2: Plane) -> bool
作用:判断两平面是否平行。
plane_perpendicular_check(pl1: Plane, pl2: Plane) -> bool
作用:判断两平面是否垂直。
plane_intersection(pl1: Plane, pl2: Plane) -> tuple | str
作用:两平面交线(方向向量与一点);平行返回 "两平面平行",重合返回 "两平面重合"。
plane_line_intersection(plane: Plane, line: Line3D) -> tuple | str
作用:平面与直线交点;平行返回 "直线与平面平行",直线在平面上返回 "直线在平面上"。
plane_projection_of_line(plane: Plane, line: Line3D) -> tuple | str
作用:直线在平面上的投影(同 line3d_projection_on_plane)。
plane_contains_point(plane: Plane, pt: Point3D) -> bool
作用:判断平面是否包含某点。
plane_contains_line(plane: Plane, line: Line3D) -> bool
作用:判断平面是否包含某直线。
四面体
tetrahedron_volume(p1: Point3D, p2: Point3D, p3: Point3D, p4: Point3D) -> Expr
作用:由四个顶点求四面体体积(=|混合积|/6)。
空间向量
vector3d_from_points(pt1: Point3D, pt2: Point3D) -> tuple[Expr, Expr, Expr]
作用:由两点构成的三维向量 (dx, dy, dz)。
vector3d_length(dx: str, dy: str, dz: str, fs: dict) -> Expr
作用:三维向量模长;dx/dy/dz 为分量字符串。
vector3d_dot(v1_dx: str, v1_dy: str, v1_dz: str, v2_dx: str, v2_dy: str, v2_dz: str, fs: dict) -> Expr
作用:两三维向量点积;参数为两向量的 6 个分量字符串。
vector3d_cross(v1_dx, v1_dy, v1_dz, v2_dx, v2_dy, v2_dz, fs) -> tuple[Expr, Expr, Expr]
作用:两三维向量叉积,返回 (x, y, z)。
vector3d_angle(v1_dx, v1_dy, v1_dz, v2_dx, v2_dy, v2_dz, fs) -> Expr
作用:两三维向量夹角(弧度)。
直线与平面综合关系
line_plane_angle(line: Line3D, plane: Plane) -> Expr
作用:直线与平面的夹角(弧度,= π/2 − 方向向量与法向量夹角)。
几何构造(由已有对象生成新对象)
plane_parallel_through_point(plane: Plane, pt: Point3D) -> Plane
作用:过一点作已知平面的平行平面。
plane_perpendicular_to_line_through_point(line: Line3D, pt: Point3D) -> Plane
作用:过一点作已知直线的垂直平面(直线方向向量即平面法向量)。
line_parallel_through_point_3d(line: Line3D, pt: Point3D) -> Line3D
作用:过一点作已知直线的平行线。
line_perpendicular_to_plane_through_point(plane: Plane, pt: Point3D) -> Line3D
作用:过一点作已知平面的垂线。
plane_through_line_and_point(line: Line3D, pt: Point3D) -> Plane
作用:过一直线和线外一点作平面。
plane_through_two_lines(l1: Line3D, l2: Line3D) -> Plane | str
作用:过两条直线作平面(须相交或平行);重合返回 "两直线重合",异面返回 "两直线异面,无法确定唯一平面"。
perpendicular_foot_to_plane(pt: Point3D, plane: Plane) -> Point3D
作用:求点到平面的垂足。
perpendicular_foot_to_line_3d(pt: Point3D, line: Line3D) -> Point3D
作用:求点到直线的垂足。
segment3d_from_points(p1: Point3D, p2: Point3D) -> Segment3D
作用:过两点构造三维线段。
斜二测画法
oblique_project(pt: Point3D) -> tuple[Expr, Expr]
作用:单点斜二测投影到二维绘图平面,返回 (X, Y)(x、z 不变,y 方向 45°、长度减半)。
oblique_project_points(points: list[Point3D]) -> list[tuple[Expr, Expr]]
作用:批量投影多个三维点。
oblique_restore_point(X: str, Y: str, z: str, fs: dict) -> tuple[Expr, Expr]
作用:斜二测逆变换,由投影坐标 (X, Y) 与已知 z 求原始 (x, y)。
oblique_area_ratio() -> tuple[Expr, str]
作用:返回水平面图形投影后的面积缩放因子 √2/4 及说明。
oblique_restore_area(projected_area: str, fs: dict) -> Expr
作用:由投影面积反求原始水平面面积 S·2√2。
oblique_project_area(original_area: str, fs: dict) -> Expr
作用:由原始水平面面积求投影面积 S·√2/4。
oblique_isometric_factor() -> Expr
作用:y 方向长度恢复因子 2√2。
oblique_project_length_y(original_length: str, fs: dict) -> Expr
作用:y 方向原始长度在投影中的贡献长度。
Example
python
from functions.solids import get_solids_result
get_solids_result(0, ["0,0,0", "1,2,2"], {}) # 两点距离 -> 3
get_solids_result(22, ["0,0,0;1,0,0;0,1,0;0,0,1"], {}) # 四面体体积 -> 1/6
Note
点坐标字符串格式为 "x,y,z";多个点用 ";" 分隔。斜二测相关操作(29–36)用于把三维坐标按斜二测画法投影到二维绘图平面或反向还原。