export interface ICollisionBox { x1: number; y1: number; x2: number; y2: number; anchorPointX: number; anchorPointY: number; } /** * 基于网格实现文本避让,大幅提升包围盒碰撞检测效率 * @see https://zhuanlan.zhihu.com/p/74373214 */ export default class CollisionIndex { private width; private height; private grid; private viewportPadding; private screenRightBoundary; private screenBottomBoundary; private gridRightBoundary; private gridBottomBoundary; constructor(width: number, height: number); placeCollisionBox(collisionBox: ICollisionBox): { box: number[]; }; insertCollisionBox(box: number[], featureIndex: number): void; /** * 后续碰撞检测都需要投影到 viewport 坐标系 * @param {THREE.Matrix4} mvpMatrix mvp矩阵 * @param {number} x P20 平面坐标X * @param {number} y P20 平面坐标Y * @return {Point} projectedPoint */ project(mvpMatrix: number[], x: number, y: number): { x: number; y: number; }; /** * 判断包围盒是否在整个网格内,需要加上 buffer * @param {number} x1 x1 * @param {number} y1 y1 * @param {number} x2 x2 * @param {number} y2 y2 * @return {Point} isInside */ isInsideGrid(x1: number, y1: number, x2: number, y2: number): boolean; }