/** * 拖动/缩放图元时的「边缘对齐吸附」:对照其他图元的 6 条候选线 * (左/中/右 + 上/中/下),如果当前 rect 的对应边距离它们小于 * 阈值(内容坐标),就把 rect 平移到精确贴合,并返回参考辅助线, * 供画布上渲染红色对齐线。 * * 阈值应保持小(典型 4~8 px / scale),避免吞掉正常拖动手感。 */ export interface AlignSnapRect { /** 用于排除自身。可为 undefined 表示参与对齐的"其他" rect */ id?: string; left: number; top: number; width: number; height: number; } export declare type AlignGuideEdgeX = 'left' | 'centerX' | 'right'; export declare type AlignGuideEdgeY = 'top' | 'centerY' | 'bottom'; export interface AlignGuide { orientation: 'v' | 'h'; /** 该参考线所在坐标(v: x;h: y) */ position: number; /** 沿参考线方向的覆盖范围 [min, max],便于 SVG 渲染端到端 */ start: number; end: number; /** 命中的当前 rect 边 */ selfEdge: AlignGuideEdgeX | AlignGuideEdgeY; /** 命中的对方 rect 边 */ otherEdge: AlignGuideEdgeX | AlignGuideEdgeY; /** 命中的对方 rect id(如果有) */ otherId?: string; } export interface AlignSnapResult { rect: { left: number; top: number; width: number; height: number; }; guides: AlignGuide[]; } /** 拖动模式:x/y 两轴可独立平移;不改尺寸 */ export interface AlignSnapDragOptions { mode: 'drag'; threshold: number; } /** 缩放模式:根据 handle 决定 left/right/top/bottom 哪条边可动 */ export interface AlignSnapResizeOptions { mode: 'resize'; threshold: number; /** 哪些边在当前缩放手柄下「可动」 */ movableEdgesX?: ('left' | 'right')[]; movableEdgesY?: ('top' | 'bottom')[]; } export declare type AlignSnapOptions = AlignSnapDragOptions | AlignSnapResizeOptions; /** * 对一个 rect 做边对齐吸附。返回 snap 后的 rect + 实际命中的辅助线(0~2 条)。 * * 算法:对 x、y 轴独立处理;每轴在所有「自身 3 边 × 所有 other 3 边」组合 * 中选距离最小且 < threshold 的一对,把自身整体平移让它们贴齐;同时记录 * 所有「平移后仍精确贴齐」的参考线(可能不止 1 条,例如 left 和 centerX * 同时与他人对齐时只有 1 条平移量但 2 条 guide)。 */ export declare function snapRectToOthers(rect: AlignSnapRect, others: AlignSnapRect[], options: AlignSnapOptions): AlignSnapResult;