是正六边形内的点

2022-09-04 06:35:02

我正在寻找有关最佳处理方式的建议。我试图找出给定的点A:(a,b)是否在正六边形内,用中心O:(x,y)和外圈的直径定义。

对于这样一个简单的情况,使用射线投射或绕组数来确定这一点似乎有点过分了,我目前正在研究查找线OA的角度(从水平方向)的选项,并将其“归一化”(可能不是正确的词)为6个等边三角形之一,看看这个新点是否位于这个三角形内。

我感觉我错过了一些简单的东西,并且有一个简单的方法(或者如果我真的很幸运,一个Java API)可以简单有效地做到这一点。

感谢您的帮助。

编辑:六边形的方向使其中一条边与水平面平放。


答案 1

您可以使用六边形每边的方程式;使用它们,您可以找出给定的点是否与六边形的中心位于同一半平面中。

例如,右上角的等式如下:

-sqrt(3)x - y + sqrt(3)/2 = 0

然后插入点的坐标,然后插入中心的坐标。如果结果具有相同的符号,则该点位于左下半平面中(因此它可能位于六边形内)。

然后,使用其他边的方程重复上述步骤。
请注意,此算法适用于任何凸多边形


答案 2

如果将问题简化为签入单个象限,则可以变得非常简单。{x = 0, y = 0, d = 1}

public boolean IsInsideHexagon(float x0, float y0, float d, float x, float y) {
    float dx = Math.abs(x - x0)/d;
    float dy = Math.abs(y - y0)/d;
    float a = 0.25 * Math.sqrt(3.0);
    return (dy <= a) && (a*dx + 0.25*dy <= 0.5*a);
}
  • dy <= a检查该点是否位于水平边缘下方。
  • a*dx + 0.25*dy <= 0.5*a检查该点是否位于倾斜右边缘的左侧。

对于 ,角点将是 和 。{x0 = 0, y0 = 0, d = 1}(±0.25, ±0.43)(±0.5, 0.0)