如何使用Python检查2D点是在2D闭合贝塞尔曲线的内部还是外部?

问题描述

enter image description here

你好

在我的2d软件中,有两个可用输入:

XY点数组

[(x,y),(1,1),(2,2),3),(-1,...]

和另一个表示闭合的2D贝塞尔曲线手柄的矩阵

[((x,(x,y)),((-1,-1),2)),((1,3)),...]

如何使用python检查点在给定曲线的内部还是外部?最好使用numpy

解决方法

我不知道贝塞尔曲线的原理,因此,如果第二点列表是一种表示贝塞尔曲线的压缩方式,请首先尝试以所需的精度对曲线的一些点进行采样。 因此,您的曲线上有n个点,然后可以应用简单的PIP算法:https://en.wikipedia.org/wiki/Point_in_polygon

如果您想知道如何以编程方式进行操作,稍后可以详细解释。

,

我不能在这里编写代码,因为我需要整个程序来正确理解,但是我可以提供两种方法来做到这一点。

  1. 最困难的方法是通过折线逼近每个贝塞尔曲线。然后,根据wiki,您可以使用两种技术:
  • 射线投射算法:该算法的简写:您放置了一条射线,该射线从一个点开始,穿过整个多边形到达另一个点。有些线位于多边形内,有些线位于多边形外。然后检查特定点属于哪条线,如下所示:

enter image description here

这种方法的巨大缺点是精度取决于您将曲线近似于多段线的程度。

  1. 第二种方法是使用位图。例如,将点设置为白色,然后将曲线下方的区域渲染为黑色,然后查看点是否仍为白色。这种方法更准确,最快,因为您可以使用GPU进行渲染。

与第一个方法相关的一些链接:

  1. https://pomax.github.io/bezierinfo/#intersections
  2. http://web.mit.edu/hyperbook/Patrikalakis-Maekawa-Cho/node80.html

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...