From ba2d6efe422fe8745025c2f4f1cc428ae9afa06b Mon Sep 17 00:00:00 2001 From: luoyifan Date: Fri, 13 Jun 2025 13:57:24 +0800 Subject: [PATCH 1/3] =?UTF-8?q?Way=20=E7=82=B9=E4=BD=8D=E7=9A=84=E5=88=A0?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/OBB矩形包围盒API.md | 93 ++++++++++++++++++++++++++++++++++++++++++++ src/example/example1.js | 84 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 177 insertions(+) create mode 100644 doc/OBB矩形包围盒API.md diff --git a/doc/OBB矩形包围盒API.md b/doc/OBB矩形包围盒API.md new file mode 100644 index 0000000..6f924a6 --- /dev/null +++ b/doc/OBB矩形包围盒API.md @@ -0,0 +1,93 @@ +## OBB 包围盒快速查找算法 + +### 物品数据结构 + +```typescript +items = ItemJson[] + +interface ItemJson { + // 物体ID, 唯一标识 + id: string + + /** + * 变换矩阵, 3x3矩阵, 采用Y轴向上为正, X轴向右, Z轴向前。右手坐标系 + */ + tf: [ + /** + * 平移向量 position, 三维坐标, [0]=x, [1]=高度值,在2D下忽略, [2]=z + */ + [number, number, number], + + /** + * 旋转向量 rotation, 单位为度。对应 three.js 应进行"角度"转"弧度"的换算 [0]=X轴逆向旋转角度, [1]=Y轴逆向旋转角度, [2]=Z轴逆向旋转角度 + */ + [number, number, number], + + /** + * 缩放向量 scale, 三维缩放比例, [0]=X宽度, [1]=Y高度,在2D下忽略, [2]=Z长度 + */ + [number, number, number], + ] +} +``` + + +### add(...items: ItemJson[]) + +添加点位 + +add(...items: ItemJson[]) + + +--- + +### update(item: ItemJson) + +更新点位 + +update(itemJson) + + +--- + +### deleteItem(id: string) + +删除点位 + +deleteItem(id: string) + + +--- + +### getItemsByPosition(x:number, z:number): ItemJson[] + +根据位置,获取命中的物品集合 + +getItemsByPosition({x:number, z:number}): ItemJson[] + + +--- + +### getItemsByPositionDistance(x, z, distance): {item, distance}[] + +getItemsByPositionDistance(x:number, z:number, distance:number): {item:ItemJson, distance:number}[] + +根据位置,获取周边单位距离内的所有物品集合,及距离 + + +--- + +### getItemsByRect(x1,y1,x2,y2): ItemJson[] + +根据矩形,获取与矩形有碰撞的所有物品集合 + +getItemsByPosition({x:number, z:number}): ItemJson[] + + +--- + +### getItemsByRect2(x1,y1,x2,y2): ItemJson[] + +根据矩形,获取矩形内的所有物品,物品OBB包围盒必须完全在矩形内 + +getItemsByPosition({x:number, z:number}): ItemJson[] diff --git a/src/example/example1.js b/src/example/example1.js index aff836d..e25f075 100644 --- a/src/example/example1.js +++ b/src/example/example1.js @@ -547,6 +547,90 @@ export default { dt: async () => import('./flash.js') } ] + }, + { + catalogCode: 'flash2', t: 'floor', + items: [ + { + id: 'flash_rack1', + t: 'flash_rack', + dt: async () => import('./flash.js') + } + ] + }, + { + catalogCode: 'flash3', t: 'floor', + items: [ + { + id: 'flash_rack1', + t: 'flash_rack', + dt: async () => import('./flash.js') + } + ] + }, + { + catalogCode: 'de1', t: 'side', + floorHeight: [ // 侧面视图的各层面高度 + 1.3, 1.3, 1.3, 1.3, 1.3, + 1.3, 1.3, 1.3, 1.3, 1.3, + 1.3 + ], + items: [ + { + id: 'elevation1', + t: 'elevation', + dt: { + lift: { // 升降机 + enable: true, // 是否启用 + width: 1.2, // 升降机侧视图宽度 + depth: 1.0 // 侧视图深度 + }, + liftLeft: { + width: 1.1, depth: 1.0, // 侧视图深度 + items: [ + { pdId: true, pdOut: true, carArrive: true }, + { pdId: true, pdOut: true, carArrive: true }, + { pdId: true, pdOut: true, carArrive: true }, + { pdId: true, pdOut: true, carArrive: true }, + { pdId: true, pdOut: true, carArrive: true }, + { pdId: true, pdOut: true, carArrive: true }, + { pdId: true, pdOut: true, carArrive: true }, + { pdId: true, pdOut: true, carArrive: true }, + { enable: false }, // 升降机[0]层 左侧的第1个位置 + { enable: false }, + { enable: false } + ] + }, + liftRight: { + width: 1.1, + items: [ + { enable: false }, + { enable: false }, + { pdId: true, pdOut: true, carArrive: true }, + { pdId: true, pdOut: true, carArrive: true }, + { pdId: true, pdOut: true, carArrive: true }, + { pdId: true, pdOut: true, carArrive: true }, + { pdId: true, pdOut: true, carArrive: true }, + { pdId: true, pdOut: true, carArrive: true }, + { pdId: true, pdOut: true, carArrive: true }, + { pdId: true, pdOut: true, carArrive: true }, + { enable: false }, + { enable: false } + ] + } + } + }, + { + id: 'elevation2', + t: 'elevation', + dt: {} + }, + { + id: 'elevation3', + t: 'elevation', + dt: {} + } + ] } ], elevator: [], // 电梯 From 0f0ec877f3c4d05aa92e5f436cbac30b4ca71744 Mon Sep 17 00:00:00 2001 From: lizw-2015 <1183409807@qq.com> Date: Fri, 13 Jun 2025 14:02:25 +0800 Subject: [PATCH 2/3] =?UTF-8?q?docs(yvan-lcc):=20=E6=9B=B4=E6=96=B0OBB=20?= =?UTF-8?q?=E7=9F=A9=E5=BD=A2=E5=8C=85=E5=9B=B4=E7=9B=92=20API=20=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在文档中添加了"选择框"标题 - 优化了文档结构,增加了空行 --- doc/OBB矩形包围盒API.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/OBB矩形包围盒API.md b/doc/OBB矩形包围盒API.md index 6f924a6..f80de84 100644 --- a/doc/OBB矩形包围盒API.md +++ b/doc/OBB矩形包围盒API.md @@ -77,6 +77,7 @@ getItemsByPositionDistance(x:number, z:number, distance:number): {item:ItemJson, --- +(选择框) ### getItemsByRect(x1,y1,x2,y2): ItemJson[] 根据矩形,获取与矩形有碰撞的所有物品集合 From 58bd25e6c748d86a7d99452185df06155edbc734 Mon Sep 17 00:00:00 2001 From: liupeng <511646242@qq.com> Date: Fri, 13 Jun 2025 14:54:57 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=8F=8C=E7=AE=AD=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/images/conveyor/shapes/triangle-double.png | Bin 0 -> 5377 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/assets/images/conveyor/shapes/triangle-double.png diff --git a/src/assets/images/conveyor/shapes/triangle-double.png b/src/assets/images/conveyor/shapes/triangle-double.png new file mode 100644 index 0000000000000000000000000000000000000000..a0db2fa5f715962a41fbd01a6fd3f989b86c2b4d GIT binary patch literal 5377 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