Files
sunvpy-docs/docs/content/43-shu-xue-ji-suan-gong-ju.md
2026-04-10 13:47:53 +08:00

735 lines
26 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
PySSMath 模块提供了丰富的数学计算功能,专为 GIS 和测绘应用设计。该模块通过 SWIG 封装底层 C++ 实现,提供高性能的几何计算、坐标转换、空间关系判断等核心算法库。本文档面向高级开发者,详细说明各类数学计算工具的 API 接口与应用场景。
Sources: [PySSMath.py](PySSMath.py#L1-L20)
## 模块架构概览
PySSMath 模块采用分层架构设计,将数学计算功能划分为多个功能域。底层通过 `_PySSMath.pyd` C++ 扩展模块实现高效计算,上层 Python 接口提供类型安全的函数调用。
```mermaid
graph TB
A[PySSMath 模块] --> B[坐标系统转换]
A --> C[距离与长度计算]
A --> D[面积计算]
A --> E[角度与方位角]
A --> F[几何变换]
A --> G[空间关系判断]
A --> H[弧线与圆操作]
A --> I[点与线操作]
B --> B1[deg/radian/dms转换]
C --> C1[点距离/线长度]
D --> D1[多边形面积/三角形面积]
E --> E1[方位角/夹角/方向]
F --> F1[旋转/偏移/缩放/镜像]
G --> G1[相交/包含/共线]
H --> H1[弧长/中点/打断]
I --> I1[插入/延伸/修剪]
A --> J[基础数据结构]
J --> J1[Point3D]
J --> J2[Vec3d]
J --> J3[POINT3DLIST]
J --> J4[LINE3DLIST]
```
Sources: [PySSMath.py](PySSMath.py#L1-L120)
## 基础数据结构
### Point3D - 三维点类
Point3D 是模块的核心数据结构,表示三维空间中的点,支持 x、y、z 坐标访问和丰富的运算符重载。
**构造方法**
- `Point3D()` - 默认构造函数
- `Point3D(x, y, z)` - 使用坐标构造
- `Point3D(other)` - 拷贝构造
**核心属性与方法**
- `x()`, `y()`, `z()` - 获取坐标分量
- `set(x_arg, y_arg, z_arg)` - 设置坐标
- `__getitem__(i)` / `__setitem__(i, value)` - 索引访问坐标0=x, 1=y, 2=z
- `__add__`, `__sub__`, `__neg__` - 向量运算
- `epsilonEqual(other, epsilon)` - 带容差的相等判断
- `getName()`, `setName(name)` - 点名称管理
Sources: [PySSMath.py](PySSMath.py#L710-L775)
### Vec3d - 三维向量类
Vec3d 提供完整的向量运算功能,包括点积、叉积、缩放等操作。
**构造方法**
- `Vec3d()` - 默认构造
- `Vec3d(x, y, z)` - 使用分量构造
- `Vec3d(other)` - 拷贝构造
**核心方法**
- `dot(rhs)` - 点积运算
- `cross(rhs)` - 叉积运算
- `__mul__`, `__truediv__` - 标量乘除
- `set(x_arg, y_arg, z_arg)` - 设置分量
- `epsilonEqual(other, epsilon)` - 带容差的相等判断
Sources: [PySSMath.py](PySSMath.py#L5345-L5400)
### 容器类
模块提供多种容器类用于管理点的集合:
- `POINT3DLIST` - 点列表容器
- `LINE3DLIST` - 线列表容器
- `LOOP3DLIST` - 环列表容器(支持带岛复杂面)
- `StringArray` - 字符串数组容器
这些容器均支持迭代器模式,提供 `size()`, `empty()`, `clear()`, `push_back()` 等标准容器操作。
Sources: [PySSMath.py](PySSMath.py#L122-L200)
## 坐标系统转换
### 角度格式转换
PySSMath 提供多种角度表示形式之间的转换功能支持弧度制、十进制度数、度分秒DMS格式互转。
| 函数名 | 功能描述 | 参数 | 返回值 |
|--------|----------|------|--------|
| `degToRadian(deg)` | 十进制度数转弧度 | deg: float | 弧度值 |
| `radianToDeg(dRadian)` | 弧度转十进制度数 | dRadian: float | 度数值 |
| `degToDms(deg)` | 十进制度数转度分秒 | deg: float | DMS 值 |
| `dmsToDeg(dms)` | 度分秒转十进制度数 | dms: float | 度数值 |
| `dmsToRadian(dDms)` | 度分秒转弧度 | dDms: float | 弧度值 |
| `radianToDms(dRadian)` | 弧度转度分秒 | dRadian: float | DMS 值 |
| `dmsToSec(dms)` | 度分秒转秒数 | dms: float | 秒数 |
| `secToDms(sec)` | 秒数转度分秒 | sec: float | DMS 值 |
**角度调整函数**
- `adjustAngle(dRadian)` - 调整弧度值到 [-π, π] 范围
- `adjustDmsAngle(dAngle)` - 调整 DMS 角度值
- `adjustDegAngle(dAngle)` - 调整度数值到 [0, 360] 范围
Sources: [PySSMath.py](PySSMath.py#L2772-L2787)
### 极坐标与直角坐标转换
| 函数名 | 功能描述 |
|--------|----------|
| `rightToPolar(x, y)` | 直角坐标转极坐标 |
| `polarToRight(r, angle)` | 极坐标转直角坐标 |
| `getPolar(p1, p2, dist, dRadian)` | 从点 p1 按给定距离和方位角获取极坐标点 |
| `getPoint(p1, p2, dist, dRadian)` - 同 `getPolar` |
Sources: [PySSMath.py](PySSMath.py#L2808-L2815)
## 距离与长度计算
### 点与点距离
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `distance(p1, p2)` | 两点间二维距离(仅 xy | float |
| `distance3d(p1, p2)` | 两点间三维距离 | float |
| `getDistSquare(p1, p2)` | 两点间距离的平方 | float |
| `get3dDistSquare(p1, p2)` | 两点间三维距离的平方 | float |
Sources: [PySSMath.py](PySSMath.py#L2680-L2690)
### 点到线距离
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `getDistPtToLine(p, p1, p2)` | 点到线段的距离 | float |
| `distPerpend(p0, p1, p2, pResPerpend, pResRelation)` | 点到线的垂距 | float |
| `distParallel(p0, p1, p2)` | 点到线的平行距 | float |
Sources: [PySSMath.py](PySSMath.py#L2710-L2720)
### 线段长度
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `getLinesSumlen(pList)` | 点列表构成线段的总长度2D | float |
| `getLinesSumlen3d(pList)` | 点列表构成线段的总长度3D | float |
| `getSumlen(pList, nLineType, mapScale)` | 获取长度(支持线型类型和比例尺) | float |
| `get3DLength(*args)` | 获取三维长度 | float |
Sources: [PySSMath.py](PySSMath.py#L2692-L2700)
### 高级距离查询
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `getNearDist(p0, pList, nOrder)` | 获取第 nOrder 近的距离 | float |
| `getNearstDistSquare(sp, Points, pNodeIndex, pSideIndex, pDirFlag, ptNearstOnline)` | 获取最近距离平方(附带详细信息) | float |
| `getDistForPoint(p, pList)` | 点到点列表中某点的距离 | float |
| `getDistDir(p, pList, irec, flag)` | 获取距离和方向 | float |
Sources: [PySSMath.py](PySSMath.py#L2702-L2710)
## 面积计算
### 多边形面积
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `getPolyArea(points, bHaveSgin)` | 计算多边形面积 | points: 点列表bHaveSgin: 是否保留符号(正为逆时针) |
| `calTriHeight(a, b, c)` | 计算三角形高 | a, b, c: 三角形三边长 |
Sources: [PySSMath.py](PySSMath.py#L2698-L2700)
### 三角形面积
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `get3DArea(sp0, sp1, sp2)` | 计算三点构成的三角形面积 | float |
| `get3DAreaInDirection(direP, sp0, sp1, sp2)` | 计算指定方向下的三角形面积 | float |
Sources: [PySSMath.py](PySSMath.py#L2793-L2796)
## 角度与方位角计算
### 方位角计算
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `bearing(x1, y1, x0, y0)` | 计算从 (x0, y0) 到 (x1, y1) 的方位角 | 弧度值 |
| `bearing(p0, p1)` - 重载形式,使用 Point3D 对象 |
| `jiaoPingfenFangWei(x1, y1, x0, y0, x2, y2)` | 计算两线段的夹角平分方位角 | 弧度值 |
Sources: [PySSMath.py](PySSMath.py#L2789-L2792)
### 夹角计算
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `openAngle(p1, p0, p2)` | 计算 ∠p1p0p2 的夹角 | 弧度值 |
| `openAngleDeg(p1, p0, p2)` | 计算 ∠p1p0p2 的夹角(度数) | 度数 |
Sources: [PySSMath.py](PySSMath.py#L2791-L2794)
### 方向计算
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `get3Direction(p0, p1)` | 获取三维空间方向向量 | Vec3d |
| `getDirection(sp, sp1, sp2)` | 获取方向 | int |
Sources: [PySSMath.py](PySSMath.py#L2794-L2797)
## 几何变换操作
### 二维/三维变换
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `rotate2DList(Points, angle, basePoint)` | 二维点集旋转 | angle: 旋转角basePoint: 旋转基点 |
| `rotate3DList(*args)` | 三维点集旋转 | 支持多种参数形式 |
| `offset2DList(Points, dx, dy)` | 二维点集平移 | dx, dy: 平移量 |
| `offset3DList(*args)` | 三维点集偏移 | 支持多种参数形式 |
| `zoom3DList(*args)` | 三维点集缩放 | 支持缩放中心 |
| `mirror3DList(baseP0, baseP1, Ps)` | 三维点集镜像 | baseP0, baseP1: 镜像轴上的两点Ps: 点集 |
| `extend3DList(Points, dist, bTail)` | 点集延伸 | dist: 延伸距离bTail: true=尾部延伸false=头部延伸 |
| `smooth3DList(Ps0, fScale, nFlag)` | 点集平滑 | fScale: 平滑系数nFlag: 平滑方式 |
| `mapping3DList(Points, ctrlPoints_old, ctrlPoints_new)` | 点集映射变换 | 基于控制点的仿射变换 |
Sources: [PySSMath.py](PySSMath.py#L2819-L2840)
### 系统坐标旋转
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `sysRotate(Xold, Yold, Xnew, Ynew, X0, Y0, dRadian)` | 系统旋转 | 将旧坐标系旋转至新坐标系 |
| `grdbodyRotate(*args)` | 网格体旋转 | 支持多种参数形式 |
Sources: [PySSMath.py](PySSMath.py#L2816-L2820)
## 几何关系判断
### 点与点关系
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `isSamePoint(p0, p1, epsilon)` | 判断两点是否相同(仅 xy | boolean |
| `isSame3dPoint(p0, p1, epsilon)` | 判断两点是否相同xyz | boolean |
| `isSameCoord(*args)` | 判断坐标是否相同 | boolean |
Sources: [PySSMath.py](PySSMath.py#L2867-L2877)
### 点与线关系
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `isPointOnLine(sp, sp1, sp2, dbLimit)` | 判断点是否在线段上 | boolean |
| `pointOnLine(*args)` | 点在线上判断(重载) | boolean |
| `getOnLinePosition(sp, sp1, sp2, dbLimit)` | 获取点在线段上的位置 | float |
Sources: [PySSMath.py](PySSMath.py#L2879-L2885)
### 点与多边形关系
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `ptInPoly(x, y, pPolygon, limit)` | 判断点是否在多边形内 | boolean |
| `ptInTriangle(x, y, x1, y1, x2, y2, x3, y3)` | 判断点是否在三角形内 | boolean |
| `isPointListInPoly(*args)` | 判断点集是否在多边形内 | boolean |
Sources: [PySSMath.py](PySSMath.py#L2901-L2905)
### 线与线关系
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `isLineCrossLine(sp1, sp2, sp3, sp4)` | 判断两线段是否相交 | boolean |
| `isLineCrossLines(sp1, sp2, Ps)` | 判断线段与多段线是否相交 | boolean |
| `getCrossPoint(*args)` | 获取线段交点 | Point3D |
| `lineCrossLine(Line, Line1, newLine, pattr)` - 线段相交处理 |
| `lineCrossLines(*args)` - 线段与多段线相交处理 |
Sources: [PySSMath.py](PySSMath.py#L5222-L5230)
### 多边形与多边形关系
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `isPolygonInPolygon(rl, line, limit)` | 判断多边形是否在另一多边形内 | boolean |
| `isPolygonInPolygonComplex(polygon1, polygon2, limit)` | 判断复杂多边形关系(支持带岛) | int |
**复杂多边形关系返回值**
- `0` - 不相关
- `1` - polygon1 包含 polygon2
- `2` - polygon2 包含 polygon1
- `3` - 相交
Sources: [PySSMath.py](PySSMath.py#L2893-L2903)
### 其他几何关系
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `isClose(Ps)` | 判断点列是否闭合 | boolean |
| `isClockwise(Rgn)` | 判断多边形是否为顺时针 | boolean |
| `isCross(P0, P1, Ps, nAvoidPoint)` | 判断线段与点列是否相交 | boolean |
| `isSamePointList(Ps1, Ps2, dbLimit, bCompareName, bCompateType, bCompareZ)` | 判断两点集是否相同 | boolean |
Sources: [PySSMath.py](PySSMath.py#L2862-L2892)
## 弧线与圆操作
### 弧长计算
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `arc3pLength(spCenter, dbRadius, PsArc)` | 计算三点圆弧长度 | spCenter: 圆心dbRadius: 半径PsArc: 弧上三点 |
| `getArcLength(spCenter, dbRadius, bClockwise, sp1, sp2)` | 计算弧长 | sp1, sp2: 弧的起点和终点bClockwise: 是否顺时针 |
Sources: [PySSMath.py](PySSMath.py#L5233-L5240)
### 弧线属性判断
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `isArcClockwise(PsArc, pCenter, pRadius)` | 判断弧线是否为顺时针 | boolean |
| `isPointOnArc(sp, PsArc, miniDist, pCenter, pRadius, nArc1, nArc2, bAdjustCoord)` | 判断点是否在弧上 | boolean |
Sources: [PySSMath.py](PySSMath.py#L5242-L5250)
### 弧线中点
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `getArcMidPoint(spCenter, dbRadius, bClockwise, sp1, sp2)` | 获取弧线中点 | Point3D |
| `getSupplementaryArc(PsArcIn, PsArcOut)` | 获取补弧 | boolean |
Sources: [PySSMath.py](PySSMath.py#L5256-L5260)
### 弧线打断与插入
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `arcBreakByPoint(PsArc, PsBreak, newArcList)` | 用点集打断弧线 | newArcList: 输出的弧线列表 |
| `circleBreakByPoint(PsCir, PsCross, newArcList)` | 用点集打断圆 | newArcList: 输出的弧线列表 |
| `insertPointToArc(sp, ArcPoints, miniDist)` | 在弧线上插入点 | miniDist: 最小距离限差 |
| `insertPointToPLineArc(sp, nLineType, PsLine, miniDist)` - 在折线弧上插入点 |
| `adjustPointToPLineArc(sp, nLineType, PsLine, pRefPoint)` - 调整点到折线弧上 |
Sources: [PySSMath.py](PySSMath.py#L5252-L5258)
### 极坐标弧生成
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `xysa_Arc(spCenter, dbRadius, bClockwise, sp1, sp2, dbArcLen, nFlag, pAngle)` | 极坐标法生成弧点 | dbArcLen: 弧长nFlag: 标志pAngle: 输出角度 |
Sources: [PySSMath.py](PySSMath.py#L5231-L5232)
## 点与线操作
### 点插入与延伸
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `innerInsertPoint(sp1, sp2, dbDist, Ps)` | 在两点之间插入点 | dbDist: 距离Ps: 输出点集 |
| `getInsertPoint(Ps, dbInterv)` | 按间隔插入点 | dbInterv: 间隔距离 |
| `getIntervPoint(Ps, dbInterv, pIndexs)` - 获取间隔点(附带索引) |
| `getlinesIntervP(pList, ResList, dInterv, dZongChang)` - 按总长和间隔获取点 |
| `innerInsertCor(Begin, End, nCount, PointList)` - 在两点间插入 nCount 个点 |
| `extend3DList_Done(Points, dbDist, bTail)` - 延伸点集 |
Sources: [PySSMath.py](PySSMath.py#L5325-L5335)
### 点修剪与去重
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `removeSameCoordPoint(*args)` - 移除相同坐标点 |
| `removeRepeatPoint(Ps, dbLimit)` - 移除重复点 | dbLimit: 限差 |
| `getRepeatPoint(Ps, nRepeats, dbLimit)` - 获取重复点 | nRepeats: 重复次数 |
Sources: [PySSMath.py](PySSMath.py#L5315-L5320)
### 线段打断
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `lineBreakByPoint(Lines, nAttrs, CrossList, newLines, bIsPLine)` - 用点集打断线段 |
| `plineSplit(PsPLine, nLineType, LineList, nAttrs, bClearPointType)` - 拆分多段线 |
| `plineMerge(*args)` - 合并多段线 |
| `arcSplit(PsArc, LineList, nAttrs)` - 打断弧线 |
Sources: [PySSMath.py](PySSMath.py#L5267-L5275)
### 中点与垂足
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `midPoint(*args)` - 获取中点 | Point3D |
| `calPoint(*args)` - 计算点位置 | Point3D |
| `getLineMidPoint(sp, Ps, pInsertAt)` - 获取线段中点 | Point3D |
| `perpend(p, p1, p2)` - 计算垂足 | Point3D |
| `perpendLize(p0, p1, p2)` - 垂直化操作 | Point3D |
Sources: [PySSMath.py](PySSMath.py#L2841-L2849)
### 高程插值
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `altitudeInterpolation(sp, sp1, sp2)` - 高程插值 | float |
| `interpolationPoint(sp1, sp2, dbZ, sp)` - 按高程插值点 | Point3D |
| `insertZValue(sp, sp0, sp1)` - 插入 Z 值 | Point3D |
Sources: [PySSMath.py](PySSMath.py#L2850-L2854)
## 高级几何操作
### 平行线生成
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `parallel(PListFrom, PListTo, dWidth, nDir, nLineType, nSharpAngleTrimType, truncations)` - 生成平行线 | dWidth: 宽度nDir: 方向nSharpAngleTrimType: 尖角处理方式0=不处理1=平头2=圆头truncations: 是否截断 |
Sources: [PySSMath.py](PySSMath.py#L2920-L2935)
### 曲线生成
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `arcToPoints(pListFrom, pl, gscale)` - 弧线转点集 | gscale: 缩放比例 |
| `circleToPoints(pListFrom, pl, gscale)` - 圆转点集 | gscale: 缩放比例 |
| `freeCurve(pList, pListRes, gscale)` - 自由曲线生成 | gscale: 缩放比例 |
| `dzlyt(pList, pListRes, gscale)` - 等值线生成 | gscale: 缩放比例 |
| `zlyt(Points, sgm, scale)` - 张力样条曲线 | sgm: 张力系数 |
Sources: [PySSMath.py](PySSMath.py#L2942-L2950)
### 椭圆操作
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `createEllipse(*args)` - 创建椭圆点集 |
| `createEllipseArc(*args)` - 创建椭圆弧点集 |
Sources: [PySSMath.py](PySSMath.py#L2951-L2952)
### 线型重建
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `gotoBeeline(srcPoints, nLineType, ArcInfoList, pResPoints)` - 转为直线 | ArcInfoList: 弧信息列表 |
| `polylineRebuild(srcPoints, nLineType, ArcInfoList, pResPoints)` - 重建多段线 |
| `gotoPoints(pList, lin_sty, pListRes, gscale, bMarkType, bForCalArea)` - 线型转换点集生成 | lin_sty: 线型bForCalArea: 是否用于计算面积 |
Sources: [PySSMath.py](PySSMath.py#L3023-L3030)
### 矩形与边界操作
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `getLineRect(sp1, sp2, rect)` - 获取线段包围盒 | boolean |
| `getPolyRectFromPointList(points)` - 获取点集的多边形包围盒 | POINT3DLIST |
| `getPolyRectFromStructList(points)` - 获取结构点集的多边形包围盒 | POINT3DLIST |
| `getMinimumRectangle(Polygon, PsRect)` - 获取最小外接矩形 | boolean |
| `isLineOutOfRect(rect, sp1, sp2)` - 判断线段是否在矩形外 | boolean |
| `isRectCrossLine(rect, sp1, sp2)` - 判断矩形与线段是否相交 | boolean |
| `isRectCrossPolygon(rect, rgnPoints)` - 判断矩形与多边形是否相交 | boolean |
Sources: [PySSMath.py](PySSMath.py#L5285-L5295)
### 点集排序
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `sortByValue(Ps, arKeys, bAscending)` - 按键值排序点集 | arKeys: 键值数组bAscending: 是否升序 |
Sources: [PySSMath.py](PySSMath.py#L5290-L5291)
## 辅助计算工具
### 数值精度处理
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `fRounding(dbData, nDecimal)` - 数值四舍五入 | nDecimal: 小数位数 |
Sources: [PySSMath.py](PySSMath.py#L5275-L5276)
### 法向量计算
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `calculateNormal(*args)` - 计算法向量 | Vec3d |
Sources: [PySSMath.py](PySSMath.py#L2798-L2799)
### 线段交点
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `getLineIntersect(p1, p2, pList, resP)` - 获取线段与点列表的交点 | resP: 输出交点 |
Sources: [PySSMath.py](PySSMath.py#L2936-L2937)
### 三角形计算
| 函数名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `calTriHeight(a, b, c)` - 计算三角形边 a 对应的高 | float |
Sources: [PySSMath.py](PySSMath.py#L2677-L2678)
### 多边形焦点
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `getPolygonFocus(_Point, rlPolygon, pClipRgn, bWidthPreference)` - 获取多边形内焦点 | _Point: 输出焦点rlPolygon: 多边形点列pClipRgn: 裁剪区域bWidthPreference: 宽度优先标志 | float: 返回值 |
Sources: [PySSMath.py](PySSMath.py#L2906-L2918)
## 常用常量
模块定义了多个数学常量和枚举常量:
**数学常量**
- `PI` - 圆周率 π
- `PI_2` - π/2
- `PI_4` - π/4
- `ZERO_FLOAT` - 零浮点数阈值
- `MIN_FLOAT` / `MAX_FLOAT` - 最小/最大浮点数
- `MINI_COORDINATE` - 最小坐标限差
- `MINI_FLOAT` / `MINI_DOUBLE` - 最小浮点数/双精度限差
**方向常量**
- `_LEFT` / `_RIGHT` / `_TOP` / `_BOTTOM` - 方向标识
- `e_East` / `e_North` / `e_West` / `e_South` - 东西北南
- `_CLOCKWISE` / `_ANTICLOCK` - 顺时针/逆时针
**点在多边形关系**
- `_IN_POLY` - 点在多边形内
- `_OUT_POLY` - 点在多边形外
- `_CLIP_POLY` - 点在裁剪多边形边界
**线型标识**
- `e_LS_Null` / `e_LS_Polyline` / `e_LS_PWline` / `e_LS_PolyArea`
Sources: [PySSMath.py](PySSMath.py#L680-L720)
## 应用示例
### 基础距离与面积计算
```python
import PySSMath
# 创建三维点
p1 = PySSMath.Point3D(100, 200, 0)
p2 = PySSMath.Point3D(150, 250, 50)
# 计算距离
dist_2d = PySSMath.distance(p1, p2)
dist_3d = PySSMath.distance3d(p1, p2)
# 创建多边形点集
polygon = PySSMath.POINT3DLIST()
polygon.push_back(PySSMath.Point3D(0, 0, 0))
polygon.push_back(PySSMath.Point3D(100, 0, 0))
polygon.push_back(PySSMath.Point3D(100, 100, 0))
polygon.push_back(PySSMath.Point3D(0, 100, 0))
# 计算面积
area = PySSMath.getPolyArea(polygon)
```
Sources: [PySSMath.py](PySSMath.py#L2680-L2698)
### 坐标转换与角度计算
```python
import PySSMath
# 角度格式转换
deg = 45.5
rad = PySSMath.degToRadian(deg)
dms = PySSMath.degToDms(deg)
# 计算方位角
azimuth = PySSMath.bearing(100, 200, 0, 0)
# 计算夹角
p_center = PySSMath.Point3D(100, 100, 0)
p1 = PySSMath.Point3D(150, 100, 0)
p2 = PySSMath.Point3D(100, 150, 0)
angle_rad = PySSMath.openAngle(p1, p_center, p2)
angle_deg = PySSMath.openAngleDeg(p1, p_center, p2)
```
Sources: [PySSMath.py](PySSMath.py#L2772-L2794)
### 几何变换操作
```python
import PySSMath
# 创建点集
points = PySSMath.POINT3DLIST()
for i in range(5):
points.push_back(PySSMath.Point3D(i * 10, i * 20, 0))
# 旋转 30 度
base_point = PySSMath.Point3D(0, 0, 0)
angle = PySSMath.degToRadian(30)
rotated = PySSMath.rotate2DList(points, angle, base_point)
# 平移
offset_x, offset_y = 50, 50
offset_points = PySSMath.offset2DList(points, offset_x, offset_y)
# 镜像
mirror_p0 = PySSMath.Point3D(0, 0, 0)
mirror_p1 = PySSMath.Point3D(100, 100, 0)
mirrored = PySSMath.mirror3DList(mirror_p0, mirror_p1, points)
```
Sources: [PySSMath.py](PySSMath.py#L2819-L2838)
### 空间关系判断
```python
import PySSMath
# 判断点是否在多边形内
test_point = PySSMath.Point3D(50, 50, 0)
is_inside = PySSMath.ptInPoly(test_point.x(), test_point.y(), polygon, 0.001)
# 判断线段是否相交
line1_p1 = PySSMath.Point3D(0, 0, 0)
line1_p2 = PySSMath.Point3D(100, 100, 0)
line2_p1 = PySSMath.Point3D(0, 100, 0)
line2_p2 = PySSMath.Point3D(100, 0, 0)
is_cross = PySSMath.isLineCrossLine(line1_p1, line1_p2, line2_p1, line2_p2)
# 获取交点
cross_point = PySSMath.Point3D()
has_cross = PySSMath.getCrossPoint(line1_p1, line1_p2, line2_p1, line2_p2, cross_point)
```
Sources: [PySSMath.py](PySSMath.py#L2893-L2918)
### 点线操作
```python
import PySSMath
# 在两点之间插入点
p_start = PySSMath.Point3D(0, 0, 0)
p_end = PySSMath.Point3D(100, 100, 0)
inserted_points = PySSMath.POINT3DLIST()
distance = 25 # 每 25 个单位插入一个点
PySSMath.innerInsertPoint(p_start, p_end, distance, inserted_points)
# 延伸线段
points_to_extend = PySSMath.POINT3DLIST()
# ... 添加点 ...
extended_points = PySSMath.extend3DList(points_to_extend, 10, True) # 尾部延伸 10 个单位
# 计算中点
midpoint = PySSMath.midPoint(p_start, p_end)
# 计算垂足
test_point = PySSMath.Point3D(50, 20, 0)
foot_point = PySSMath.perpend(test_point, p_start, p_end)
```
Sources: [PySSMath.py](PySSMath.py#L2841-L2850)
## API 快速索引表
### 按功能分类
| 功能分类 | 关键函数 |
|----------|----------|
| **坐标转换** | degToRadian, radianToDeg, dmsToDeg, degToDms, rightToPolar, polarToRight |
| **距离计算** | distance, distance3d, getDistSquare, getDistPtToLine, getNearstDistSquare |
| **面积计算** | getPolyArea, get3DArea, get3DAreaInDirection, calTriHeight |
| **角度计算** | bearing, openAngle, openAngleDeg, jiaoPingfenFangWei, getDirection |
| **几何变换** | rotate2DList, rotate3DList, offset2DList, offset3DList, zoom3DList, mirror3DList, smooth3DList |
| **点操作** | midPoint, calPoint, extend3DList, innerInsertPoint, removeRepeatPoint |
| **线操作** | getLinesSumlen, getLinesSumlen3d, parallel, lineBreakByPoint, plineSplit |
| **弧操作** | arc3pLength, getArcLength, getArcMidPoint, isArcClockwise, arcBreakByPoint |
| **关系判断** | isSamePoint, isPointOnLine, ptInPoly, isLineCrossLine, isPolygonInPolygonComplex |
| **辅助工具** | fRounding, calculateNormal, getMinimumRectangle, sortByValue |
Sources: [PySSMath.py](PySSMath.py#L2670-L5400)
## 性能优化建议
1. **批量操作优先**:对于大量点集的操作,优先使用 `POINT3DLIST` 容器和批量处理函数(如 `rotate3DList`),避免逐点循环。
2. **合理使用限差参数**:在关系判断函数中(如 `isSamePoint`, `ptInPoly`),根据数据精度合理设置 `epsilon``limit` 参数,避免浮点数精度问题。
3. **避免重复计算**:对于需要多次使用的结果(如距离、面积),缓存中间结果而非重复计算。
4. **使用距离平方**:在仅需比较距离大小的场景下,使用 `getDistSquare` 而非 `distance`,避免开方运算开销。
Sources: [PySSMath.py](PySSMath.py#L2680-L2720)
## 进阶主题
### 复杂多边形处理
对于带岛(洞)的复杂多边形,使用 `isPolygonInPolygonComplex` 函数判断多边形间关系。该函数支持嵌套多边形结构,返回详细的关系标识(包含、相交、独立等)。
### 弧线重建与识别
使用 `gotoBeeline``polylineRebuild` 函数可以将拟合的弧线转换为直线段,或将直线段识别为弧线结构,配合 `ArcInfoList` 输出弧线参数信息。
### 高级几何变换
`mapping3DList` 函数支持基于控制点的仿射变换,可实现不规则的空间映射,适用于校正变形数据。
Sources: [PySSMath.py](PySSMath.py#L2893-L2950)
## 相关文档
- [坐标转换工具](44-zuo-biao-zhuan-huan-gong-ju) - 专门的坐标系统转换模块
- [地理对象类型定义](42-di-li-dui-xiang-lei-xing-ding-yi) - 地理对象类型与属性
- [工作空间与地图概念](8-gong-zuo-kong-jian-yu-di-tu-gai-nian) - 空间参考与投影系统