package com.sundablog.clipper;

import com.sundablog.clipper.Point.LongPoint;


public interface Clipper {
    /**
     * 裁剪操作类型枚举
     * INTERSECTION: 交集 - 保留两个多边形的重叠区域
     * UNION: 并集 - 合并两个多边形的所有区域
     * DIFFERENCE: 差集 - 保留第一个多边形减去与第二个多边形重叠的部分
     * XOR: 异或 - 保留两个多边形不重叠的区域
     */
    enum ClipType {
        INTERSECTION, UNION, DIFFERENCE, XOR
    }

    /**
     * 方向枚举
     * RIGHT_TO_LEFT: 从右到左
     * LEFT_TO_RIGHT: 从左到右
     */
    enum Direction {
        RIGHT_TO_LEFT, LEFT_TO_RIGHT
    }

    /**
     * 端点类型枚举
     * CLOSED_POLYGON: 闭合多边形 - 形成封闭的多边形
     * CLOSED_LINE: 闭合线段 - 连接起点和终点形成封闭线段
     * OPEN_BUTT: 开放齐平端点 - 不延伸线段端点
     * OPEN_SQUARE: 开放方形端点 - 延伸线段端点形成方形
     * OPEN_ROUND: 开放圆形端点 - 延伸线段端点形成圆形
     */
    enum EndType {
        CLOSED_POLYGON, CLOSED_LINE, OPEN_BUTT, OPEN_SQUARE, OPEN_ROUND
    }

    /**
     * 连接类型枚举
     * SQUARE: 方形连接 - 形成方形拐角
     * ROUND: 圆形连接 - 形成圆形拐角
     * MITER: 斜接连接 - 延伸两条线段形成尖拐角
     */
    enum JoinType {
        SQUARE, ROUND, MITER
    }

    /**
     * 多边形填充类型枚举
     * EVEN_ODD: 奇偶规则 - 从点出发画射线,穿过偶数次边界为外部,奇数次为内部
     * NON_ZERO: 非零环绕规则 - 从点出发画射线,计算边界交叉次数,非零为内部
     * POSITIVE: 正环绕规则 - 仅填充多边形的正环绕区域
     * NEGATIVE: 负环绕规则 - 仅填充多边形的负环绕区域
     */
    enum PolyFillType {
        EVEN_ODD, NON_ZERO, POSITIVE, NEGATIVE
    }

    /**
     * 多边形类型枚举
     * SUBJECT: 主体多边形 - 被裁剪的多边形
     * CLIP: 裁剪多边形 - 用于裁剪的多边形
     */
    enum PolyType {
        SUBJECT, CLIP
    }

    /**
     * Z填充回调接口
     * 用于自定义Z轴填充算法的回调函数
     */
    interface ZFillCallback {
        /**
         * 执行Z轴填充操作
         * @param bot1 第一个边界的底部点
         * @param top1 第一个边界的顶部点
         * @param bot2 第二个边界的底部点
         * @param top2 第二个边界的顶部点
         * @param pt 当前处理的点
         */
        void zFill(LongPoint bot1, LongPoint top1, LongPoint bot2, LongPoint top2, LongPoint pt);
    }

    //初始化选项常量,可传递给构造函数...
    /**
     * 反向解决方案标志
     * 设置此标志会反转输出多边形的顶点顺序
     */
    int REVERSE_SOLUTION = 1;

    /**
     * 严格简单多边形标志
     * 确保输出多边形是简单多边形(没有自相交)
     */
    int STRICTLY_SIMPLE = 2;

    /**
     * 保留共线点标志
     * 在输出多边形中保留共线的顶点
     */
    int PRESERVE_COLINEAR = 4;

    /**
     * 添加单个路径到裁剪器
     * @param pg 要添加的路径
     * @param polyType 路径的多边形类型(主体或裁剪)
     * @param Closed 是否为闭合路径
     * @return 添加是否成功
     */
    boolean addPath(Path pg, PolyType polyType, boolean Closed);

    /**
     * 添加多个路径到裁剪器
     * @param ppg 要添加的路径集合
     * @param polyType 路径的多边形类型(主体或裁剪)
     * @param closed 是否为闭合路径
     * @return 添加是否成功
     */
    boolean addPaths(Paths ppg, PolyType polyType, boolean closed);

    /**
     * 清除裁剪器中的所有路径和数据
     */
    void clear();

    /**
     * 执行裁剪操作,使用默认填充规则
     * @param clipType 裁剪操作类型
     * @param solution 存储结果的路径集合
     * @return 操作是否成功
     */
    boolean execute(ClipType clipType, Paths solution);

    /**
     * 执行裁剪操作,使用指定的填充规则
     * @param clipType 裁剪操作类型
     * @param solution 存储结果的路径集合
     * @param subjFillType 主体多边形的填充规则
     * @param clipFillType 裁剪多边形的填充规则
     * @return 操作是否成功
     */
    boolean execute(ClipType clipType, Paths solution, PolyFillType subjFillType, PolyFillType clipFillType);

    /**
     * 执行裁剪操作,结果存储在PolyTree中,使用默认填充规则
     * @param clipType 裁剪操作类型
     * @param polytree 存储结果的多边形树结构
     * @return 操作是否成功
     */
    boolean execute(ClipType clipType, PolyTree polytree);

    /**
     * 执行裁剪操作,结果存储在PolyTree中,使用指定的填充规则
     * @param clipType 裁剪操作类型
     * @param polytree 存储结果的多边形树结构
     * @param subjFillType 主体多边形的填充规则
     * @param clipFillType 裁剪多边形的填充规则
     * @return 操作是否成功
     */
    boolean execute(ClipType clipType, PolyTree polytree, PolyFillType subjFillType, PolyFillType clipFillType);
}
最后修改:2025 年 12 月 01 日
如果觉得我的文章对你有用,请随意赞赏