# rect-tri
**Repository Path**: nodets/rect-tri
## Basic Information
- **Project Name**: rect-tri
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-10-22
- **Last Updated**: 2025-10-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# rect-tri
一个高性能的TypeScript库,用于矩形网格三角化,生成3D渲染所需的顶点坐标、三角形索引和顶点法线。支持ESM、CJS和IIFE多种模块格式,适配不同开发环境。
## 特性
- 通过`tri`函数生成矩形网格的顶点位置(x, y, z)和三角形索引
- 通过`normal`函数计算顶点法线(支持复用已有数组,优化内存)
- 性能优化:最小化循环开销,采用缓存友好的内存访问模式
- 支持大型网格(使用Uint32Array索引,可处理超过65535个顶点)
- 多模块格式:同时提供ESM(ES模块)、CJS(CommonJS)和IIFE(立即执行函数),适配浏览器、Node.js及打包工具
## 安装
```bash
npm install rect-tri
```
## 快速开始
### 1. ESM环境(现代浏览器/Node.js 14+)
```typescript
import { tri, normal } from 'rect-tri';
// 定义网格尺寸(100列 × 100行)
const gridWidth = 100;
const gridHeight = 100;
// 1. 生成顶点和索引(无需预分配数组,函数内部自动创建)
const { positions, indices } = tri(gridWidth, gridHeight);
// 2.(可选)修改z坐标(添加高度数据,如地形高度图)
for (let i = 0; i < positions.length; i += 3) {
positions[i + 2] = Math.sin(i / 30) * 5; // 示例:正弦波高度
}
// 3. 计算法线(两种方式)
// 方式1:自动创建法线数组
const normals1 = normal(positions, indices);
// 方式2:复用已有法线数组(适合频繁更新场景,减少内存分配)
const normals2 = new Float32Array(positions.length);
normal(positions, indices, normals2); // 结果直接写入normals2
// 在3D渲染中使用(WebGL、Three.js等)
console.log('顶点数据:', positions);
console.log('索引数据:', indices);
console.log('自动创建的法线:', normals1);
console.log('复用的法线数组:', normals2);
```
### 2. CJS环境(Node.js传统模块)
```javascript
const { tri, normal } = require('rect-tri');
// 用法同上...
```
### 3. 浏览器IIFE(直接通过`
```
## API
### `tri(width, height)`
生成矩形网格的顶点位置和三角形索引(内部自动创建数组)。
#### 参数
- `width`: `number`
网格宽度(列数,必须为正整数)。
- `height`: `number`
网格高度(行数,必须为正整数)。
#### 返回值
`{ positions: Float32Array; indices: Uint32Array }`
- `positions`: 顶点坐标数组,格式为`[x0,y0,z0, x1,y1,z1, ...]`(z初始化为0,可后续修改)。
- `indices`: 三角形索引数组,每个网格单元生成2个三角形(共6个索引)。
### `normal(positions, indices, normals?)`
通过平均相邻三角形的面法线计算顶点法线(支持复用数组)。
#### 参数
- `positions`: `Float32Array`
顶点坐标数组(由`tri`生成,长度必须为3的倍数)。
- `indices`: `Uint32Array`
三角形索引数组(由`tri`生成,长度必须为3的倍数)。
- `normals`(可选): `Float32Array`
预分配的法线数组(长度需与`positions`一致),用于存储结果。若不传入,将自动创建新数组。
#### 返回值
`Float32Array`
归一化的顶点法线数组,格式为`[nx0,ny0,nz0, nx1,ny1,nz1, ...]`。
#### 注意事项
- 若传入`normals`数组,函数会先清零数组以避免残留数据影响结果。
- 法线最终会被归一化为单位向量,确保光照计算的一致性。
## 模块格式说明
| 模块格式 | 适用环境 | 导入方式 | 输出文件路径 |
|----------|-------------------------|------------------------------|-------------------------------|
| ESM | 现代浏览器、Webpack/Vite | `import { tri } from 'rect-tri'` | `dist/index.js` |
| CJS | Node.js、旧版打包工具 | `const { tri } = require('rect-tri')` | `dist/index.cjs` |
| IIFE | 传统浏览器(直接引入) | 全局变量`rectTri` | `dist/rect-tri.iife.js` |
## 性能优化
- **减少算术运算**:用基于加法的行偏移替代循环内的乘法运算,降低计算开销。
- **消除分支判断**:通过限制索引生成范围(仅处理非边缘网格),避免循环内条件判断,提升分支预测效率。
- **缓存友好**:采用连续内存访问模式,提高顶点/索引数据的缓存命中率。
- **数组复用**:`normal`函数支持传入预分配数组,减少频繁内存分配的开销(适合动画等实时场景)。
- **批量写入**:使用`Uint32Array.set`批量写入索引数据,减少单个数组赋值的性能损耗。
## 许可证
MIT