跳转至

立体几何计算(functions/solids.py)

functions/solids.py 提供三维解析几何计算(点、直线、平面、空间向量、四面体,以及斜二测画法的投影与还原)。注意:本模块不包含球、圆柱、圆锥、棱柱、棱锥等立体的表面积 / 体积公式——这些由 UI 的「计算」等功能页以其他方式处理。对外主接口为 get_solids_result(字符串接口);另导出一批底层辅助函数,直接接收 sympy 三维几何对象(Point3DLine3DPlane 等)。

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)用于把三维坐标按斜二测画法投影到二维绘图平面或反向还原。