是正六边形内的一个点

Ada*_*dam 11 java algorithm geometry polygon

我正在寻找有关最佳方法的建议.我试图找出给定点A:(a,b)是否在正六边形内,定义为中心O:(x,y)和外接圆的直径.

这似乎有点小题大做使用光线投射,或清盘数量确定这一点,对于这样一个简单的例子,目前我看找到行OA的角度(从水平)的选项,"正常化" (可能不是正确的词)它成为6个等边三角形中的一个,看看这个新点是否位于这个三角形内.

我觉得我错过了一些简单的东西,并且有一种简单而有效的方法(或者如果我真的很幸运,一个Java API).

谢谢你的帮助.

编辑:六边形的方向使得其中一个边与水平面平齐.

Mar*_*rot 8

如果您将问题减少到检查{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);
}
Run Code Online (Sandbox Code Playgroud)
  • dy <= a 检查该点是否低于水平边缘.
  • a*dx + 0.25*dy <= 0.5*a 检查该点是否在倾斜的右边缘的左侧.

因为{x0 = 0, y0 = 0, d = 1},角点将是(±0.25, ±0.43)(±0.5, 0.0).


Cos*_*min 6

您可以使用六边形的每个边的方程式; 通过它们,您可以了解给定点是否与六边形的中心位于同一半平面中.

例如,右上角有等式:

-sqrt(3)x - y + sqrt(3)/2 = 0
Run Code Online (Sandbox Code Playgroud)

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

然后,您可以使用其他方面的方程式重复.
请注意,此算法适用于任何凸多边形.

  • 有可能对此进行详细说明吗?我想我从概念上讲得到了,但是您那里的代码片段对我而言并不合理。 (3认同)

Rom*_*ner 6

这就是我一直在使用的:

public bool InsideHexagon(float x, float y)
{
    // Check length (squared) against inner and outer radius
    float l2 = x * x + y * y;
    if (l2 > 1.0f) return false;
    if (l2 < 0.75f) return true; // (sqrt(3)/2)^2 = 3/4

    // Check against borders
    float px = x * 1.15470053838f; // 2/sqrt(3)
    if (px > 1.0f || px < -1.0f) return false;

    float py = 0.5f * px + y;
    if (py > 1.0f || py < -1.0f) return false;

    if (px - py > 1.0f || px - py < -1.0f) return false;

    return true;
}
Run Code Online (Sandbox Code Playgroud)

px并且py是坐标系的坐标xy投影到坐标系上,更容易检查边界.

在此输入图像描述