Clipper库 | 坐标圆整和精度控制

news2024/11/18 18:35:08

坐标圆整造成的问题

在Clipper库中顶点(IntPoint)的坐标使用的是整数类型, 目的是为了保持数字的鲁棒性,所以用整数类型来存储坐标,而不是我们常见的浮点数类型(浮点存在不精确性)。然而坐标圆整会带来如下两个问题:

  • 参与计算的顶点位置和真实的顶点位置存在一定偏差。对于一些数值极小的或相差极小的顶点难以处理。

  • 造成微小的自交。

在这里插入图片描述

上图中,三个黑点是黄色和紫色多边形区域的实际交点,三个红点是三个黑点经坐标圆整之后的位置,黑点与红点之间的虚线表示对应关系。经过圆整后,造成了一个微小的自交区域。

解决方案

对于第一个问题,官方给出的解决方案为适当的缩放。同时指出Clipper库能接受范围为±0x3fffffffffffffffff (4.6e+18)的整数坐标值,支持扩展到非常高的精度 。这说明我们可以放心得对极小数值或极小数值差进行一个较大倍数的缩放,不会造成算法上的问题。

我们可以简单写一个装饰器,装饰我们用于多边形处理的函数。

import math

def numeric_scaling(digits: 'int > 0' = 7, *, pos: list):	# 必需参数pos:指定缩放参数
    def decorate(func):
        def scaled(*_args):
            __args = list(_args)
            f = math.pow(10, digits)  # 数值精度,默认为7位小数
            for p in pos:
                if isinstance(_args[p], int) or isinstance(_args[p], float):
                    __args[p] *= f
                elif isinstance(_args[p], list):
                    __args[p] = [[tuple(map(lambda x: x * f, pt)) for pt in path] for path in _args[p]]
                else:
                    pass
            _result = func(*tuple(__args))  # _result is list of paths
            _result = [[tuple(map(lambda x: x / f, pt)) for pt in path] for path in _result]
            return _result

        return scaled

    return decorate

用例:

from pyclipper import *

@numeric_scaling(digits = 7, pos = [0, 1])
def offset(polys, delta, jt = JT_SQUARE):  # 偏置函数,输人多边形:[[[pt1_x,pt2_y],...,[ptN_x,ptN_y]],[...],...]
    pco = PyclipperOffset()
    pco.AddPaths(polys, jt, ET_CLOSEDPOLYGON)
    sln = pco.Execute(delta)  # 偏置距离delta
    return sln  # 返回Polyline列表

if __name__ == '__main__':
    polys = [[(0, 0), (100, 0), (100, 100), (0, 100)]]
    print(offset(polys, -7.5))  # 向内偏置7.5

上面代码中 digits 为数值精度,其大小同样为输出结果中点坐标的小数位数。

对于第二个问题,官方给出两种解决方案:

  • 使用 CleanPolygons 函数去除。
  • ClipperStrictlySimple 属性设置为true

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

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

相关文章

Kerberos身份验证在ChunJun中的落地实践

Kerberos,在古希腊神话故事中,指的是一只三头犬守护在地狱之门外,禁止任何人类闯入地狱之中。 那么在现实中,Kerberos指的是什么呢? 一、Kerberos介绍 01 Kerberos是什么 根据百度词条释义,Kerberos是一…

Java——并查集

概念 当我们将多个元素分配到不同的集合中,这些集合有的是相关的,有的是不相关的。并查集就是用来查找两个元素是否在同一个集合中的 其主要实现方式是:将所有的元素以下标的形式存储在数组中。例如一共有十个人,那么就将这些人…

C语言tips-野指针

0.写在最前 最近因为工作需要开始重新学c语言,越学越发现c语言深不可测,当初用python轻轻松松处理的一些数据,但是c语言写起来却异常的复杂,这个板块就记录一下我的c语言复习之路 1. 什么是野指针? 如果一个指针指向的…

一文带你深入理解【Java基础】· IO流(上)

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

机器学习100天(五):005 数据预处理之划分训练集

机器学习100天,今天讲的是:数据预处理之划分训练集。 在上一节,我们对类别特征进行了编码,X 和 y 已经变成了机器学习可以理解和处理的数据格式。 下面我们就要对数据集进行划分,划分成训练集和测试集。 在监督式机器学习中,我们一般使用训练集的数据来训练模型,然后…

【LVGL学习笔记】(二) 基础概念

LVGL全程LittleVGL,是一个轻量化的,开源的,用于嵌入式GUI设计的图形库。并且配合LVGL模拟器,可以在电脑对界面进行编辑显示,测试通过后再移植进嵌入式设备中,实现高效的项目开发。 LVGL中文教程手册&#…

心理健康网站

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 管理员功能: 1、管理关于我们、联系我们 2、管理文章类型、添加心理文章 3、审核咨询师注册信息 4、查看咨询…

我的创作纪念日——为什么要写博客

文章目录收获意义憧憬收获 转载和摘抄只是对知识的搜集,不仅不会起到扩充知识体系的作用,反而会让人陷入盲目的自信或者自卑。一些人会把收藏当作底蕴,例如看到一个如何快速学Python的标题,就会逢人说自己会Python;另…

哈夫曼树,哈夫曼编码及应用——(代码实现)

哈夫曼树,哈夫曼编码及应用1.哈夫曼树1.1 什么是哈夫曼树2.如何构造哈夫曼树(哈夫曼算法)2.1 举例实现哈夫曼树2.1.1手动实现具体步骤2.1.2代码实现具体步骤3.哈夫曼编码3.1 什么是哈夫曼编码3.2哈夫曼编码的具体实现END!!!1.哈夫曼树 路径长…

零基础可以学习Python吗?转行小白怎么学Python?

ython学习常用的技巧有这些:一是要明确自己的学习目的;二是从易到难,循序渐进;三是合理的选择资料,有所取舍;四是坚定自己的信念。以下是关于Python学习技巧的具体介绍。 1、明确自己的学习目的 每个人学Python的初衷绝对是不一样的&#xf…

【观察】Akamai:向分布式云迈出坚实一步,让云和边缘“无处不在”

近年来,云正如同日常生活中的水、电那样,融入到社会的各个层面,它不再是一种单纯的架构或者技术,而是千行百业走向数字化的核心基础设施;云也正在变成一种融合剂,无论是大数据、人工智能、物联网等&#xf…

多目标背包问题:MOJAYA求解多目标背包问题(Multi-objective Knapsack Problem,MOKP)提供Matlab代码

一、多目标背包问题 1.1多目标背包问题描述 多目标背包问题(Multi-objective Knapsack Problem,MOKP)是一种重要的组合优化问题,在生活的许多领域都有着十分广泛的应用。多目标背包问题可以描述为:给定一个背包和n种物品,其中&a…

docker-compose安装gogs

1.gogs是什么 Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 所有平台,包括 Linux、Mac OS X、Windows 以及 ARM 平台。 2.准备工作gogs 在安装软…

论文精读:《FCOS3D: Fully Convolutional One-Stage Monocular 3D Object Detection》

文章目录论文精读摘要(Abstract)1. 介绍(Introduction)2. 相关工作(Related Work)3. 方法(Approach)3.1 框架总览(Framework Overview)3.2 2D引导的多层次3D预测(2D Guided Multi-Le…

【java】javac 相关API JavaCompiler StandardJavaFileManager AbstractProcessor

1.概述 转载并且补充:Java 编译器 javac 笔记:javac API、注解处理 API 与 Lombok 原理 看这个文章之前首先看:【java】java JSR 269 自定义注解实战 Lombok @Data注解 java版本直接调用 javac 是 Java 代码的编译器 [openjdk, oracle ],初学 Java 的时候就应该接触过。…

马上跨年了,如何用代码写一个“跨年倒计时”呢?

前言 大家好,我是陈橘又青,再过两周就是新的一年了,作为一名有仪式感的程序员,今天我们就来制作一个简单的跨年倒计时小网页,祝看到的所有人新年快乐!(附上完整源码,需要的小伙伴自取…

八、Docker 安装Mysql(流程、注意点、实例)

Docker 安装mysql 要不 安装tomcat 稍微复杂些,要配置一些参数,例如mysql密码,配置文件编写等。 1、docker hub上面查找mysql镜像 地址:Docker Hub 可以拉取最新的,也可以按照tag搜索自己想要的版本,拉取 2、从docker hub上拉取mysql5.7镜像到本地 命令:docker pull …

【实时数仓】DWM层设计模式、独立访客(UV)的计算

文章目录一 DWS层与DWM层的设计1 设计思路2 DWS层需求分析二 DWM层-UV计算1 需求分析与思路2 从kafka中读取数据(1)代码实现(2)测试(3)总结3 UV过滤 -- 独立访客计算(1)实现思路&…

Spring+SpringMVC+MP登录案例(含拦截器)

技术框架 后端:Spring、Spring MVC、Mybatis-Plus 前端:HTML、CSS、Layui、JS、Jquery 功能模块技术 1、用户的每一个请求使用了SpringMVC 拦截器技术,没有登录的用户自动重定向到登录页 2、统一请求模式,使用Restful风格对后端…

贤鱼的刷题日常(数据结构栈学习)-1551:Sumsets--题目详解

🏆今日学习目标: 🍀例题讲解1551:Sumsets ✅创作者:贤鱼 ⏰预计时间:25分钟 🎉个人主页:贤鱼的个人主页 🔥专栏系列:c 🍁贤鱼的个人社区,欢迎你的…