Clipper库 | 类型和填充规则

news2024/12/27 19:09:00

裁剪类型(ClipType)

CT_INTERSECTION = 0
CT_UNION = 1
CT_DIFFERENCE = 2
CT_XOR = 3
  • 交集,AND (intersection) :主体和裁剪多边形相交的区域。
  • 并集,OR (union) - 主体和裁剪多边形两者合并的区域。
  • 非/差,NOT (difference) - 裁剪多边形以外主体的区域。
  • 异或,XOR (exclusive or) - 主体和裁剪多边形两者相交以外的区域。

在这里插入图片描述

在这里插入图片描述

ClipType 的用法:

在使用 Clipper 对象对多边形进行裁剪时,可以通过在执行方法 Execute 中传入 ClipType 参数指定裁剪(布尔运算)类型。

Clipper.Execute 方法描述如下:

def Execute(self, *args, **kwargs):
    """
    Performs the clipping operation and returns a list of paths.

        Keyword arguments:
        clip_type      -- type of the clipping operation
        subj_fill_type -- fill rule of subject paths
        clip_fill_type -- fill rule of clip paths

        Returns:
        list of resulting paths

        Raises:
        ClipperException -- operation did not succeed
    """
    pass

闭合类型(EndType)

ET_CLOSEDPOLYGON = 0
ET_CLOSEDLINE = 1
ET_OPENBUTT = 2
ET_OPENSQUARE = 3
ET_OPENROUND = 4
  • etClosedPolygon: 末端根据JoinType的值连接,填充路径使用多边形。
  • etClosedLine: 末端根据JoinType的值连接,填充路径使用多线段。
  • etOpenButt: 末端为直角,且没有延伸。
  • etOpenSquare: 末端为直角,并且向路径外延伸一部分。
  • etOpenRound: 末端为圆角,并且向路径外延伸一部分。
  • etOpenSingle: 在一个方向上偏移一个开放路径,计划在未来更新。(我在Python下用的6.2.1版本还没有。)

在这里插入图片描述

EndType 参数只在 ClipperOffset.AddPathClipperOffset.AddPaths 中用到,用于规定偏置轮廓的闭合方式。

连接类型(JoinType)

JT_MITER = 2
JT_ROUND = 1
JT_SQUARE = 0

在这里插入图片描述

  • jtMiter:斜角衔接。对一些窄角度,向外偏置可能会产生非常长的“尖峰”。
    在这里插入图片描述

    因此我们需要设置 ClippOffset.MiterLimit 属性用来指定原始顶点将被偏移的最大距离(以 delta 的倍数),即在距离原始顶点 delta 倍数的距离上,将斜边截断成倒方角(这样就变成和 jtSquare 一样的连接效果了)。

  • jtRound: 圆弧衔接。将所有斜边角进行到圆角处理。我们知道圆角其实是由倒角近似形成的,所以Clipper库引入ClipperOffset.ArcTolerance 属性(圆弧精度)指定了近似处理弧线时可接受的最大不精确性(“公差”)。

    在这里插入图片描述

    ArcTolerance 默认值为0.25,说明qd(倒角偏离真实圆弧的最大距离)不超过0.25。我们可以发现,qd越小,整个近似圆弧越光滑,代价就是我们需要插入更多的顶点。

  • jtSquare: 矩形衔接。将所有斜边角进行倒角 C1×delta

感觉和数控技术中刀具偏置路径连接差不多。

其中提到的 delta 是在 ClipperOffset.Execute 方法中传入的参数。

def Execute(self, *args, **kwargs): # real signature unknown
    """
        Performs the offset operation and returns a list of offset paths.

        	Keyword arguments:
            delta -- amount to which the supplied paths will be offset - negative delta shrinks polygons,
            	positive delta expands them.

            Returns:
            list of offset paths
        """
    pass

裁剪填充类型(PolyFillType) - 填充规则

PFT_EVENODD = 0
PFT_NEGATIVE = 3
PFT_NONZERO = 1
PFT_POSITIVE = 2

**填充规则(fill rule)**用于判断在封闭图形中,哪些区域是内部,哪些区域是外部(如’孔‘)。Clipper库支持4个填充规则:

  • Even-Odd(奇偶)
  • Non-Zero(非零)
  • Positive(正)
  • Negative(负)

我认为下面这张图比官方描述更加易于理解。我们赋予每个多边形子区域一个绕数。根据多边形的方向和一条外部到内部的射线来计算区域的绕数。

在这里插入图片描述

图源自:《计算机辅助制造实践——Python实现三维打印路径规划》P163。

填充规则描述如下:

  • 奇偶填充 : 奇数子区域填充,偶数子区域不填充。

    奇偶填充最简单,不需要借助绕数。奇偶填充规定:和射线相交的第奇数个轮廓内部区域是填充区域,第偶数个轮廓内部区域是非填充区域。适用于多边形本身和多边形之间不存在自相交的情况。

  • 非零填充:所有绕数非零的区域都填充。

  • 正填充:所有绕数 >0的区域都填充。

  • 负填充:所有绕数 < 0的区域都填充。

目前使用最广泛的填充规则是奇偶和非零填充。

PolyFillType 的用法:

在使用 Clipper 对象对多边形进行裁剪时,可以通过在执行方法 Execute 中传入 PolyFillType 指定 subj_fill_type (主体多边形的填充规则)和 clip_fill_type (裁剪多边形的填充规则)参数。

裁剪属性(PolyType)

PT_CLIP = 1
PT_SUBJECT = 0

裁剪属性有2个:

  • 主体多边形(ptSubject ):被裁剪多边形,也就是主体多边形。
  • 裁剪多边形(ptClip ):裁剪多边形,使用此多边形裁剪主体多边形。

PolyType 的用法:

在使用 Clipper 对象对多边形进行裁剪时,可以通过在执行方法 AddPaths 中传入 PolyType 指定传入的多边形(paths)的裁剪属性 poly_type(即是裁剪对象还是被裁剪对象)。

def AddPaths(self, *args, **kwargs): # real signature unknown
    """
    Add a list of paths.
    
            Keyword arguments:
            paths     -- paths to be added
            poly_type -- type of added paths - subject or clip
            closed    -- True if added paths are closed, False if open
    
            Returns:
            True -- all or some paths are valid for clipping and were added
    
            Raises:
            ClipperException -- all paths are invalid for clipping
    """

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

net/http 库的客户端实现(上)

前言 Go语言标准库 net/http 是一个非常强大的标准库&#xff0c;使得构建 HTTP 请求和编写 Web 服务器的工作变得非常简单。 我们来看看是他是如何实现客户端和服务端的。 使用示例 假设本地有一个GET方法的HTTP接口&#xff0c;响应 Hello World&#xff01; 使用 net/ht…

Cesium:实时数据渲染性能优化与内存泄漏问题分析

在基于Cesium.js三维可视化开发框架,采用“轮询”策略,实现单车点位数据的实时渲染的demo示例,线上部署完毕之后,竟发现出现了“内存泄漏”的问题。思前想后,反复调试,然而并没有找到引发泄露的根源所在,最后偶然间在《JavaScript高级程序设计(第4版)》中看到了问题的答…

HashTable源码解析

HashTable源码解析 简介 HashTable 是一个古老的&#xff08;JDK1.0 时就已存在&#xff09;线程安全的容器&#xff0c;其核心方法都是 synchronized 修饰的。 相反 HashMap 不是线程安全的。 HashTable与HashMap对比 二者继承体系 HashTable HashMap 从图中可以对比得出…

零基础的小白如何学习编程,该怎么入手学习?

零基础的小白如何学习编程&#xff0c;该怎么入手学习&#xff1f;这是一个被问烂透而有很有趣的话题了。听到这个问题时&#xff0c;小编的第一反应就是要弄清楚对方为什么要学习编程&#xff0c;这是一个很好地起点&#xff0c;清楚自己想要什么&#xff0c;才能去努力实现。…

【JY】 ABAQUS子程序UEL的有限元原理与应用

不等待即关注【简述ABAQUS中UEL子程序】ABAQUS作为成熟的商用有限元软件&#xff0c;可为高级用户提供特定的分析需求。ABAQUS常见的二次开发子程序包括&#xff1a;UMAT、VUMAT、UGENS、UEL和VUEL等。其中UEL/VUEL分别适用于ABAQUS的Standard/Explicit求解器。只有清楚有限元分…

零基础怎么学Python编程,新手常犯哪些错误?

Python是人工智能时代最佳的编程语言&#xff0c;入门简单、功能强大&#xff0c;深获初学者的喜爱。 很多零基础学习Python开发的人都会忽视一些小细节&#xff0c;进而导致整个程序出现错误。下面就给大家介绍一下Python开发者常犯的几个错误。 1、错误的使用变量。 在Pyt…

华为网工入门之eNSP小实验(5)--VLAN间相互通信的三种方法

VLAN间相互通信 实际网络部署中一般会将不同IP地址段划分到不同的VLAN。同VLAN且同网段的PC之间可直接进行通信&#xff0c;无需借助三层转发设备&#xff0c;该通信方式被称为二层通信。VLAN之间需要通过三层通信实现互访&#xff0c;三层通信需借助三层设备(路由器,三层交换…

高可用系列文章之二 - 传统分层架构技术方案

前文链接 高可用系列文章之一 - 概述 - 东风微鸣技术博客 (ewhisper.cn) 三 技术方案 3.1 概述 单点是系统高可用最大的风险和敌人&#xff0c;应该尽量在系统设计的过程中避免单点。 保障系统的高可用, 方法论上&#xff0c;高可用保证的原则是「集群化」(或 「冗余」), …

LeetCode HOT 100 —— 312.戳气球

题目 有 n 个气球&#xff0c;编号为0 到 n - 1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球&#xff0c;你可以获得 nums[i - 1] * nums[i] * nums[i 1] 枚硬币。 这里的 i - 1 和 i 1 代表和 i…

别只关注chatGPT能不能写论文了,它还支持49中场景,代码都给你写好了,速领

简介 chatGPT最近非常不稳定&#xff0c;访问一不小心就出现了网络错误&#xff0c;根本就不能很好的使用。那么我们该怎么办呢&#xff1f;勇哥给大家想到了一个种办法&#xff0c;就是用程序去调用openapi的接口&#xff0c;这个接口虽然是收费的&#xff0c;但是可免费使用…

linux下源码编译cloudcompare(解决无法加载pcd文件的问题)

cloudcompare是一款点云处理软件&#xff0c;里面有很多算法&#xff0c;值得大家学习研究。 下面介绍linux下源码编译cloudcompare的方法。 1.安装依赖&#xff1a; sudo apt-get install doxygen sudo apt install cmake-curses-gui2.下载&#xff1a; git clone --recurs…

Qt之天气预报——界面优化篇(含源码+注释)

一、界面优化效果 下方为界面优化完成和优化前的效果对比。 优化前&#xff1a; 优化后&#xff1a; 二、优化内容 添加标题栏添加图片&#xff08;图图标素材源自阿里巴巴矢量图标库&#xff09;更新UI内容&#xff08;微调大小、布局比例&#xff09;添加鼠标事件函数&…

Java 教程

Java 教程 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。 Java 可运行于多个平台&#xff0c;如 Windows, Mac OS 及其他多种 UNIX 版本的系统。 本教程通过简单的实例将让大家更好的了解 Java 编程语言。 移动操作系统 Android 大部分的代码采用…

RepVGG:一个结构重参数化网络

本文来自公众号“AI大道理” ResNet、DenseNet 等复杂的多分支网络可以增强模型的表征能力&#xff0c;使得训练效果更好。但是多分支的结构在推理的时候效率严重不足。 看起来二则不可兼得。 能否两全其美&#xff1f; RepVGG通过结构重参数化的方法&#xff0c;在训练的时候…

2022 年 Kubernetes 高危漏洞盘点

2022 年&#xff0c;Kubernetes继续巩固自己作为关键基础设施领域的地位。从小型到大型组织&#xff0c;它已成为广受欢迎的选择。出于显而易见的原因&#xff0c;这种转变使 Kubernetes 更容易受到攻击。但这还没有结束&#xff0c;开发人员通常将Kubernetes 部署与其他云原生…

【2022.12.18】备战春招Day13——每日一题 + 234. 回文链表 + 139. 单词拆分

【每日一题】1703. 得到连续 K 个 1 的最少相邻交换次数 题目描述 给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1 。每一次移动&#xff0c;你可以选择 相邻 两个数字并将它们交换。 请你返回使 nums 中包含 k 个 连续 1 的 最少 交换次数 输入&#xff1a;nums …

【数据结构】堆(二)——堆排序、TOP-K问题

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《数据结构》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 堆排序&#xff1a;&#xff08;以小堆为例&#xff09; Heapsort函数…

C语言重点解剖关键字要点速记

1.在windows中&#xff0c;双击的本质是运行该程序&#xff0c;就是将程序(.exe)加载到内存当中去。任何程序在被运行之前都必须加载到内存当中去。 2.所有的变量本质都是在内存的某个位置开辟的。变量不能定义在硬盘上&#xff0c;因为变量必须在程序运行的时候才能被开辟&am…

SPRING-了解1

1)最终address: 查找路径比较长&#xff0c;很有趣 JFrog 原始步骤1)进入 spring.io&#xff0c;点击右上角黑色标记边的标记 2)进入 git,找到 Binaries下面的 Spring Framework Artifacts 3)进一步找到Downlaoding a Distribution,下面有 https://repo.spring.io 4)x选择…

牛客SQL每日一题之SQL136 每类试卷得分前3名

文章目录SQL136 每类试卷得分前3名描述示例1输入&#xff1a;输出&#xff1a;答案SQL136 每类试卷得分前3名 描述 现有试卷信息表examination_info&#xff08;exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间&#xff09;&#x…