我在python中对多边形中的点(jordan曲线定理)的改编是否正确?

我在python中对多边形中的点(jordan曲线定理)的改编是否正确?,python,python-3.x,polygon,intersection,points,Python,Python 3.x,Polygon,Intersection,Points,问题 我最近发现需要确定我的点是否在多边形内。所以我在C++中学习了方法,并将其应用到Python。但是,我认为C++代码学习不太正确。我相信我已经把它修好了,但我不太确定,所以我希望比我聪明的人能帮我弄明白这一点 定理非常简单,思想是这样的,给定第n个闭合多边形,你画一条任意的线,如果你的点在里面,你的线会与边相交奇数次。否则,您将是偶数,并且它位于多边形之外。非常酷 我有以下测试用例: polygon_x=[5,5,11,10] 多边形_y=[5,10,5,10] 测试1_x=6 测试1_y

问题

我最近发现需要确定我的点是否在多边形内。所以我在C++中学习了方法,并将其应用到Python。但是,我认为C++代码学习不太正确。我相信我已经把它修好了,但我不太确定,所以我希望比我聪明的人能帮我弄明白这一点

定理非常简单,思想是这样的,给定第n个闭合多边形,你画一条任意的线,如果你的点在里面,你的线会与边相交奇数次。否则,您将是偶数,并且它位于多边形之外。非常酷

我有以下测试用例:

polygon_x=[5,5,11,10]
多边形_y=[5,10,5,10]
测试1_x=6
测试1_y=6
结果1=多边形中的点(test1\u x,test1\u y,多边形x,多边形y)
打印(结果1)
测试2_x=13
测试2_y=5
结果2=多边形中的点(测试2\u x,测试2\u y,多边形x,多边形y)
打印(结果2)
如果我将其定义如下,则上述两种情况均为假:

            if polygon_x[i] < polygon_x[(i+1) % length]:
                temp_x = polygon_x[i]
                temp_y = polygon_x[(i+1) % length]
            else:
                temp_x = polygon_x[(i+1) % length]
                temp_y = polygon_x[i]
摘要

有人能给我解释一下
temp\u x
temp\u y
方法在做什么吗?另外,如果我为
polygon\ux
重新定义
temp\ux
temp\uy
polygon\uy
重新定义
temp\ux
的修正是正确的方法?我对此表示怀疑。这就是原因

对我来说,
temp\u x
temp\u y
发生的事情没有什么意义。对于
i=0
,显然
polygon\ux[0]
false
,因此我们得到
temp\ux[1]=5
temp\uy[0]=5
。这就是
(5,5)
。这正好是我的一对。但是,假设我将我的点按顺序输入算法(根据轴,两两完整性始终是必须的),类似于:

x = [5, 10, 10, 5]
y = [10,10, 5, 5]
在这种情况下,当
i=0
时,我们得到
temp\u x[1]=10
temp\u y[0]=10
。好的,巧合的是
(10,10)
。我还测试了“修正”算法
(9,9)
的点,它仍然在里面。简言之,我正试图找到一个反例,解释为什么我的修复方案不起作用,但我不能。如果这是工作,我需要了解该方法正在做什么,并希望有人可以帮助解释给我

不管怎样,如果我是对的还是错的,如果有人能帮助我更好地了解这个问题,我将不胜感激。我甚至愿意以更有效的方式解决n多边形的问题,但我想确保我正确理解代码。作为一名编码员,我对一种毫无意义的方法感到不舒服


非常感谢你倾听我以上的想法。欢迎任何建议

>你误解了链接C++代码中的<代码> X1 < /C>和X2值,误解导致你在Python中选择不合适的变量名。这两个变量都包含
x
值,因此
temp_y
是一个非常容易引起误解的名称。更好的名称可能是
min\u x
max\u x
,因为它们是构成多边形边的顶点的
x
值的最小值和最大值。代码的更清晰版本可以写成:

for i in range(length):
    min_x = min(polygon_x[i], polygon_x[(i+1)%length])
    max_x = max(polygon_x[i], polygon_x[(i+1)%length])

    if x_min < target_x <= x_max:
        # ...
范围内i的
(长度):
min_x=min(多边形_x[i],多边形_x[(i+1)%length])
max_x=max(多边形_x[i],多边形_x[(i+1)%length])

如果x_minmatplotlib
有一种方法可以解决这个问题。它适用于任意路径对象(包括多边形)。哇,这是一个惊人的反应!:)今晚我会测试一些东西来验证,但我会说这是官方答案的一个巨大候选。谢谢我有一个重要的后续问题。我认为多边形x和多边形y的顺序无关紧要?最后,我想为我的算法提供从KML文件解析的小正方形或多边形矩形。我怎样才能保证我不会弄坏我的形状?也许是为了创造边缘?那么多边形_x=[5,10,10,5]和多边形_y=[5,5,10,10]也有效吗?我只需要确定我在KML排序中的坐标是有意义的。对吗?我对KML文件一无所知,但我无法想象它们以任意顺序存储多边形顶点,因为这是不明确的。更可能的是,它们始终以顺时针或逆时针顺序排列顶点。对于这个算法,哪一个都不重要!我测试了这些变化,这似乎是可行的。如果我能在python库中找到现成的解决方案,我可能会使用它,但是更好地理解它的工作原理是很好的。您是否有任何阅读或在线参考资料可以帮助我更好地理解行生成代码?我有点想把我的牙齿咬住这个乔丹曲线的方法。真是太聪明了。
for i in range(length):
    min_x = min(polygon_x[i], polygon_x[(i+1)%length])
    max_x = max(polygon_x[i], polygon_x[(i+1)%length])

    if x_min < target_x <= x_max:
        # ...