用于确定点是否在六边形内的功能

时间:2017-03-20 12:28:01

标签: python math

首先让我说明,虽然我的问题是编程性的,但我遇到的部分有点数学。所以我不确定这是否是发布它的正确位置,但我不确定其他地方。

我尝试定义一些布尔函数,如果点(x,y)在某个形状内,则返回true,如果在外,则返回false。为了澄清这一点,下面的代码可用于定义内半径r1和外半径r2的环(环):

def ring(pos):
    (x, y) = pos
    rsq = x ** 2 + y ** 2
    return (r1 ** 2 < rsq < r2 ** 2)

我的问题是,如果有人可以帮我提出一个聪明的方法来为六边形区域定义这样的函数。具体来说,我想定义一个边长s(直径的一半)的六边形区域,以原点为中心。理想地,它也将被定向成使得顶部和底部是侧面,与x轴相对应。

4 个答案:

答案 0 :(得分:3)

使用对称性进入第一象限,然后进行简单的数学运算(毕达哥拉斯就足够了)来检查该点是否在对角线下面&#34; (其中y = sqrt) (3)⋅(s - x))和&#34;在上边缘&#34; (其中y = sqrt(3)/2⋅s)。

>>> def hexagon(pos):
        x, y = map(abs, pos)
        return y < 3**0.5 * min(s - x, s / 2)

演示:

>>> s = 13
>>> for y in range(-s, s+1):
        print(' '.join('.X'[hexagon((x, y))] for x in range(-s, s+1)))

. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . X X X X X X X X X X X X X . . . . . . .
. . . . . . X X X X X X X X X X X X X X X . . . . . .
. . . . . . X X X X X X X X X X X X X X X . . . . . .
. . . . . X X X X X X X X X X X X X X X X X . . . . .
. . . . . X X X X X X X X X X X X X X X X X . . . . .
. . . . X X X X X X X X X X X X X X X X X X X . . . .
. . . X X X X X X X X X X X X X X X X X X X X X . . .
. . . X X X X X X X X X X X X X X X X X X X X X . . .
. . X X X X X X X X X X X X X X X X X X X X X X X . .
. . X X X X X X X X X X X X X X X X X X X X X X X . .
. X X X X X X X X X X X X X X X X X X X X X X X X X .
. X X X X X X X X X X X X X X X X X X X X X X X X X .
. X X X X X X X X X X X X X X X X X X X X X X X X X .
. . X X X X X X X X X X X X X X X X X X X X X X X . .
. . X X X X X X X X X X X X X X X X X X X X X X X . .
. . . X X X X X X X X X X X X X X X X X X X X X . . .
. . . X X X X X X X X X X X X X X X X X X X X X . . .
. . . . X X X X X X X X X X X X X X X X X X X . . . .
. . . . . X X X X X X X X X X X X X X X X X . . . . .
. . . . . X X X X X X X X X X X X X X X X X . . . . .
. . . . . . X X X X X X X X X X X X X X X . . . . . .
. . . . . . X X X X X X X X X X X X X X X . . . . . .
. . . . . . . X X X X X X X X X X X X X . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .

答案 1 :(得分:1)

您的解决方案基本上基于极坐标。由于响铃或圆圈位于原点的中心位置,因此您并不关心true:您只需要检查θ是否位于r内的磁盘或[0,r_max]一枚戒指。

您可以使用polar definition of an hexagon并检查[r_min,r_max]是否在r内。

以下是numpy和matplotlib的示例:

[0,r_hexagon(θ)]

显示:enter image description here

您可以使用上面的import numpy as np import matplotlib.pyplot as plt import math theta = np.arange(0, 2 * math.pi, 0.01) sixty_d = math.pi / 3 def hexagon(theta): return math.sqrt(3) / (2 * math.sin(theta + sixty_d - sixty_d * math.floor(theta / sixty_d))) hexagon = np.vectorize(hexagon) ax = plt.subplot(111, projection='polar') ax.plot(theta, hexagon(theta)) ax.set_rmax(1.5) ax.set_rticks([0.5, 1, 1.5]) ax.grid(True) ax.set_title("Hexagon in polar coordinates", va='bottom') plt.show() 来获取最大半径。可以使用hexagon(theta)计算theta

答案 2 :(得分:1)

我的两分钱:

def inside(pos, R):
    import numpy as np
    r = R * np.sqrt(3) / 2
    try:  # thanks to @stefan-pochmann
        phi = np.arctan(pos[1] / pos[0])
    except ZeroDivisionError:
        phi = 0.0
    length = np.sqrt(pos[0] ** 2 + pos[1] ** 2)
    for i in range(3):
        rot = 2 * np.pi / 3.0 * i
        new_phi = phi + rot
        new_pos = (length * np.sin(new_phi), length * np.cos(new_phi))
        if abs(new_pos[0]) <= np.sqrt(R ** 2 - r ** 2) and abs(new_pos[1]) <= r:
            return True
    return False

假设六边形以(0, 0)为中心,R为规定的圆半径,r为内切圆。{/ p>

它不是环算法的实现。它使用边界框

答案 3 :(得分:0)

在六边形周围创建一个边界框,高度是中心角之间的距离让我们说a,宽度是左右刻面之间的距离让我们说b。
如果你有六角形的预定尺寸,你可以很容易地获得围绕它的4个三角形的面积 因此,您可以测试您的点是否在这些三角形中的一个,如果不是,那么它在六边形中。

 ________
|   /\   |
|* /  \ *|  This is an illustration of the above suggestion
| /    \ |  The * are points outside the hexagon.
|/      \|
|        |
|        |
|\      /|
| \    / |
| *\  / *|
|___\/___|