# @expofp/geometry 中文文档

规范地址：https://npmcn.com/package/%40expofp/geometry/

版本：3\.49\.2
npm 元数据更新时间：2026-11-13T16:00:50.723Z
中文译文更新时间：2026-11-14T05:41:14.869Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40expofp/geometry
原文对照：https://npmcn.com/package/%40expofp/geometry/?lang=original
项目主页：https://developer.expofp.com/
源码仓库：https://github.com/expofp/efp-app

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：147 kB，22 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：1 个
- 首次发布：2026-06-23T17:54:50.347Z
- 最新版本发布：2026-11-13T16:00:50.266Z
- 近 30 天下载量：9273（2026-10-14 至 2026-11-12，npm 官方下载统计）
- 已发布版本数：133（近 12 个月 133 个）

## 中文简介

ExpoFP SDK 内部:共享几何原始

## 安装

```sh
npm install @expofp/geometry
```

也可以使用：`pnpm add @expofp/geometry`、`yarn add @expofp/geometry`、`bun add @expofp/geometry`

## README

# @ expofp/ 几何

零依赖性 **2.5D (韩语)** expoFP SDK的几何原始: `Point`, (中文(简体) ), `Line`, (中文(简体) ), `Box`, (中文(简体) ), `Rect`, (中文(简体) ), `Polygon`, (中文(简体) ), `Mesh`,加上它们身上的自由函数。 没有运行时间依赖关系( 甚至没有) `three`) (中文(简体) ).

**"2.5D" (英语)** 表示: 三维 `Point` 矢量,但是 **形状由 2D 定位于 3D `elevation`** ——平地形状为给定高地. 所有空间数学(距离、角度、面积、限制、, )在 **xy 飞机**· ; `elevation` 定位形状和相交点 (见《协调公约》)。 一个真正的3D形状是 `Mesh` (一个三角网,它的顶点承载着) 真实 `z`),用于非平面的渲染器几何.

## 初级

| 类型 | 这是什么 |
| --- | --- |
| `Point` | 可变的 三维向量 (N)`x`, (中文(简体) ), `y`, (中文(简体) ), `z`) (中文(简体) ). `width`编号 :`height` 别名 `x`编号 :`y` 所以一个点可以加倍的大小。 低层建筑挡住形状. |
| `Line` | 二者之间的一段 **二维** 点数 (`p0`, (中文(简体) ), `p1`单人 `elevation` (默认为0). |
| `Box` | 一个 **轴向对齐** 矩形(分/最大角,缓存中心/大小). 2D级, **无限用z** (无高地)——用于边框和屏幕尺寸. A 类 `Box` 结构满足 `RectLike`所以,任何需要一个 `RectLike` 接受一个 `Box` (无旋转的无高直径,在任何高地相交). |
| `Rect` | 一个矩形 **可能旋转**: 中间+大小+ `rotation` + 键 `elevation` (两者均为默认 0). 在给定高地上面向长方形. |
| `Polygon` | A 类 **平面图** 三角多边形: 2D `vertices` + 三角形 `indices` +一个 `elevation`,带有缓存边框 `Box`已经 `containsPoint`编号 :`area` (因地平而定义良好). 使用命令环来建造一个对流 `Polygon.fromConvexRing`。 。 。 . |
| `Mesh` | A 类 **三维** 三角网: 三维 `vertices` + 键 `indices`,带有缓存 (xy) 边界 `Box`. 仅变革 -- -- **没有 `containsPoint`编号 :`area`** (未定义为非平面网格). 对于不平坦的渲染器几何. |

`Shape = Box | Rect | Polygon | Mesh`歧视 `is*` 品牌字段并随着导出而缩小 警卫 `isBox` 编号 : `isRect` 编号 : `isPolygon` 编号 : `isMesh`。 。 。 .

**坐标公约:** `x` 左起-右起-, `y` 增加上-下(屏幕,y-下)。 旋转 进入 **弧度,正 = 顺时针**制服在每一个原始人和助手身上`Rect`, (中文(简体) ), `Polygon`, (中文(简体) ), `Mesh`,则 `point*`编号 :`line*` 角度函数). `elevation` (和 `Point.z`飞机外高; 积极是向观众. **空间操作在 xy 平面中计算** 距离,角度, 区域,以及 `containsPoint` 忽略 `z`编号 :`elevation`。 。 。 . **交叉** 测试(`lineIntersection`, (中文(简体) ), `intersectLineRect`比较 `elevation` 仅在 **两者** 操作定义它( 一个 `undefined` 高度 - (单位:千美元) `Box`,或者一个赤裸的 `LineLike` ——指"任何高度"并总是相交;当两者被定义时 仅在一个 `elevationTolerance` (默认) `1e-3`),结果点 `z` 为共享 高处.

## 设计决定

### 2.5D: 二维形状+高地, 1 三维 `Mesh`

`Point` 是唯一内在的-3D 类型(矢量)。 每个 _形状_ 二维定位为 `elevation` (单位:千美元)`Box` 没有,它无穷无尽. `Polygon` 是浮图,所以它 `containsPoint`编号 :`area` 准确; 真实 三维几何用途 `Mesh`,故意省略了这些操作(非平面上的"指点") 网点只会是xy-silhouette测试.

### 默认不可变, 与 `set` 变异器

形状是不可变值对象: 获取器返回只读视图, 每个变换返回 a **新设** 例如,所以共享几何(例如:一个展位的矩形)不能从另一个读取器下突变出. 每个 原始( e)`Point`, (中文(简体) ), `Line`, (中文(简体) ), `Box`, (中文(简体) ), `Rect`, (中文(简体) ), `Polygon`, (中文(简体) ), `Mesh`)暴露出一个单一的公众,道克旗下 `set(...)` 变异者——逃出者孵化出变换器通过写出,更新字段的方式如: `elevation` 已经就位.

### 通过 a 的 Opt-in 突变 `target` 参数

因为不可改变的变换会分配,所以每个变换也会接受一个可选的 **`target`** 撰写 结果是不分配——相同的平面图三。 js 使用,但倒置,所以默认为纯:

```ts
const moved = box.translate(offset); // new Box (immutable default)
box.translate(offset, box); // writes into box itself (opt-in mutation)
box.translate(offset, scratch); // reuse a scratch Box in a hot loop
```

自由函数在写入目标前读取所有输入, 因此将输入传递为目标 (单位:千美元)`f(x, …, x)`这是安全的。 使用 `target` 只有特征分析显示分配事项.

### 类 + 自由函数( 二重性)

每个行动都是 **纯自由函数** 超过结构 `*Like` 输入,每类都显示 **稀薄方法** 向它前进:

```ts
lineLength(line); // free function, accepts any { p0, p1 }
line.length(); // method → lineLength(this)

boxTranslate(box, offset); // free function
box.translate(offset); // method → boxTranslate(this, offset)
```

自由函数接受结构形状( F)`Point2Like`, (中文(简体) ), `LineLike`, (中文(简体) ), `RectLike`, (中文(简体) ), `MeshLike`,所以打电话的人 不需要阶级实例 也没有阶级身份组合 提供可发现性和 锁链.

### 一次定义的变形/ 并列逻辑( E)`Polygon` 重复使用 `Mesh`(中文(简体) )

`Polygon` 结构满足 `MeshLike` (它的2D顶点满足) `PointLike`因此,变换和 合并逻辑生命 **一次** 在网格自由函数上—— `meshTranslate` 编号 : `meshScale` 编号 : `meshRotate` 编号 : `meshMerge` (单位:千美元) `meshBounds`) (中文(简体) ). 两者 `Mesh`还有.. `Polygon`方法通过可选 `target`(单位:千美元) `Polygon` 目标保持结果 a `Polygon` (保留了线路),a `Mesh` 目标保持它 (单位:千美元) `Mesh`。 。 。 .

### 结构输入类型

输入是松散的 `*Like` 类型(`Point2Like = { x, y }`, (中文(简体) ), `RectLike = { center, size, rotation?, elevation? }`, (中文(简体) ), `MeshLike`, (中文(简体) ), `PolygonLike`,......);产出是具体的类例。 行动 `translate` 编号 : `expand` 编号 : `scale` 带 `number | Point2Like` (平面形状,如 `Box`)或(或) `number | PointLike` (单位:千美元) 三维 `Point` ops)——向两轴的斯卡尔广播,一个点给出了每轴值.

### 品牌代替 `instanceof`

每个原始人都带着 `readonly is<Name> = true` 字段( 三. js 样式) 幸存的重复模块复制和序列化。 这个 `Shape` 警卫检查品牌而不是 `instanceof`,仅接受 `Shape` (误入歧途) `{ isBox: true }` 对象不能伪装成盒子.

## 地理(`geo`(中文(简体) )

这个 `geo` 模块提供WGS-84球上的纯大地测量数学。 这是一个 **单独 坐标空间** 从上面的平面原始人 ——没有一个 明确桥梁.

| 符号 | 说明 |
| --- | --- |
| `LatLng` | `{ lat: number; lng: number }` ——小数度;后向北正,向东正 |
| `GeoAnchor` | `{ local: Point2Like; geo: LatLng }` ——投影桥使用的函文 |
| `haversineDistance(a, b)` | 大圆相距以米为单位 |
| `bearing(from, to)` | 以度为单位的初始指南针 `[0, 360)` |
| `destinationPoint(from, distanceM, bearingDeg)` | 目标 `LatLng` 来源、距离和轴承 |
| `projectLocalToGps(point, a, b)` | 绘制本地地图 `Point2Like` 改为 `LatLng` 通过两个锚 |
| `projectGpsToLocal(geo, a, b)` | 地图a `LatLng` 向当地 `Point2Like` 通过两个锚-反向上述 |

**公约(不同于平面原始人):**

-   坐标在 **学位** (不是弧度数).
-   轴心是 **指南针**数字 : **0=北,90=东,180=南,270=西**,顺时针增加.
-   地球半径常数 : **6 371 000米(5 000米)** (WGS-84平均半径).

这是故意防火墙 从平板会议(角 在弧度, 从+x轴起正时针, y-下屏幕坐标, 欧几利得相去. 唯一的桥梁是 `projectLocalToGps` 编号 : `projectGpsToLocal`, (中文(简体) ), 需要验证的 `GeoAnchor` 输入——没有输入底板-域逻辑 `geo`。 。 。 .

## 常见问题

### @expofp/geometry 是什么？

ExpoFP SDK 内部:共享几何原始

### 如何安装 @expofp/geometry？

在项目目录运行 npm install @expofp/geometry，或使用 pnpm add / yarn add / bun add。

### @expofp/geometry 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @expofp/geometry 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @expofp/geometry 可以商用吗？

@expofp/geometry 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @expofp/geometry 的下载量有多少？

根据 npm 官方下载统计，@expofp/geometry 在 2026/10/14 – 2026/11/12 这 30 天内被下载 9,273 次，日均约 309 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @expofp/geometry 还在维护吗？

最新版本 3\.49\.2 发布于 2026/11/14（今天）；至今共发布 133 个版本，其中过去 12 个月发布了 133 个；首次发布于 2026/06/24。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

