import { IConnectEnd, IPoint } from "../../../../idl";
import { BezierCurve } from "./BezierCurve";
import { OolongLine } from "../../../../graphics";
import { Point } from "../../../../common";
import { NodeManager } from "../../../../application";
/**
 * 曲线端点的“出入方向”信息。
 * 这里不是最终控制点，而是一个单位方向向量，用来约束曲线在端点附近
 * 应该朝哪个方向拉出/进入。
 */
export interface IDirection {
    direction: {
        x: number;
        y: number;
    };
}
/**
 * BezierWorker 负责“根据一组关键点，生成/重算曲线点列”。
 *
 * 这份点列在项目里有两类主要来源：
 * 1. 连接型曲线：端点吸附到节点边上，需要让曲线正对节点边进入/离开；
 * 2. 自由曲线：没有节点连接关系，只需要生成视觉上平滑的贝塞尔曲线。
 *
 * 这个类本身不直接做渲染，它只产出最终的 points 数组，
 * 后续由 OolongLine / CurveDrawer 按贝塞尔点列去画。
 */
export declare class BezierWorker {
    /**
     * 将方向信息归一化为单位向量。
     *
     * 这样后续在按距离外推控制点时，只需要关注“方向”和“拉出的长度”，
     * 不需要担心输入向量长度不一致。
     */
    private normalizeDirection;
    /**
     * 对控制点拉出距离做一个简单的上下限裁剪。
     *
     * 目的：
     * - 连接太短时，不要几乎没有弯曲；
     * - 连接太长时，也不要把控制点拉得过远导致曲线绕得太夸张。
     */
    private clamp;
    /**
     * 为“单段曲线”直接生成一组三次贝塞尔控制点：[start, p1, p2, end]。
     *
     * 这是这次 quick create / 连接型曲线优化的核心方法。
     * 当曲线本质上只有一个起点和终点时，我们不再走复杂样条推导，
     * 而是直接根据起终点的出入方向来设计两侧控制点。
     *
     * 规则大致是：
     * - 如果两端主要是水平出入，则控制点沿 X 方向展开；
     * - 如果两端主要是垂直出入，则控制点沿 Y 方向展开；
     * - 如果有方向但不是纯水平/垂直，则按方向向量外推；
     * - 如果没有方向信息，则退化成普通两点贝塞尔。
     *
     * 这样做的主要收益是：
     * - 箭头能更正地贴着节点边进入；
     * - 多条从同一锚点分叉出去的曲线更容易形成“扇出”；
     * - quick create 场景下不容易中途互相缠绕。
     */
    private computeSingleCurveControlPoints;
    /**
     * 将一段已存在的贝塞尔曲线在 1/2 位置拆分，用于曲线控制点编辑场景。
     *
     * 返回的并不是最终 points 数组，而是中间拆分后的控制信息，
     * 供 CurveControlPointProcessor 在交互过程中继续细化。
     */
    splitCurve(curve: BezierCurve): {
        lP: Point;
        midPoint: IPoint;
        rP: Point;
    };
    /**
     * 针对“已存在的线”重算曲线点列。
     *
     * 这里会先从 line.connectProps 里取出起点/终点是否连接到节点，
     * 如果连接了，就进一步推导出端点应该朝哪个方向出入，
     * 再把这些信息交给 computeCurvePoints。
     *
     * 典型调用方：
     * - 拖拽曲线端点重新吸附节点
     * - 编辑曲线控制点
     * - 删除曲线的一段后重算
     */
    computeCurvePointsForLine(line: OolongLine, nodeManager: NodeManager, linePoints?: IPoint[]): IPoint[];
    /**
     * 根据 connect end（对象 id + 相对锚点坐标）反推出端点的方向信息。
     *
     * 如果端点没有连接到节点，返回 undefined；
     * 如果连接到了节点，就会进一步计算：
     * - 命中的边（上/右/下/左）
     * - 节点本身的旋转角度
     * 最终得到一个可用于外推控制点的方向向量。
     */
    computeConnectEndInfo(start: IConnectEnd | null, nodeManager: NodeManager): IDirection | undefined;
    /**
     * 将“连接边 + 节点旋转角度”换算成世界坐标系下的方向向量。
     *
     * 例如：
     * - Top    -> 默认向上
     * - Right  -> 默认向右
     * 再叠加节点旋转角度后，得到真实出入方向。
     */
    private computeEndDirection;
    /**
     * 根据连接端信息找到“它连接在目标节点的哪一条边上”。
     *
     * 这里顺带把节点角度也带出来，因为后面生成方向向量时需要一起考虑。
     */
    private computeEndType;
    /**
     * 给定一组关键点，生成最终用于渲染的贝塞尔点列。
     *
     * 输入的 linePoints 可以理解成“骨架点”：
     * - 可能只有两个端点；
     * - 也可能已经是一串多段点列。
     *
     * 输出则是项目内约定的曲线 points：
     * 每 4 个点表示一段三次贝塞尔（首尾段会共享端点）。
     *
     * 处理策略：
     * - 点太少时，走 fallback；
     * - 只有一段曲线时，走 computeSingleCurveControlPoints；
     * - 多段曲线时，沿用原有样条式的控制点推导，保证编辑场景的连续性。
     */
    computeCurvePoints(linePoints: IPoint[], startInfo?: IDirection, endInfo?: IDirection): IPoint[];
    /**
     * linePoints 不足以直接拆成标准贝塞尔段时的兜底逻辑。
     *
     * 常见于：
     * - 只有两个点的初始化曲线
     * - quick create / 节点连接这种“起点终点明确，但中间骨架点很少”的场景
     *
     * 这里优先复用单段曲线控制点策略，尽量让少点曲线也保持稳定。
     */
    private computeFallbackCurvePoints;
    /**
     * 已知 start-mid-end 三个关键点时，计算穿过 midPoint 的一对控制点。
     *
     * 这套算法更多用于“多段曲线编辑”：
     * - 用户拖控制点
     * - 用户在已有曲线上继续调整
     *
     * 目标不是让曲线绝对几何最优，而是让折点处的曲线尽量平滑、连续。
     * 末尾的凸包判断是为了稳定控制点左右顺序，避免出现局部翻折。
     */
    computeCurveControlPoint(startPoint: IPoint, midPoint: IPoint, endPoint: IPoint): {
        lP: Point;
        midPoint: IPoint;
        rP: Point;
    };
}
//# sourceMappingURL=BezierWorker.d.ts.map