Ada*_*dam 11 java algorithm geometry polygon
我正在寻找有关最佳方法的建议.我试图找出给定点A:(a,b)是否在正六边形内,定义为中心O:(x,y)和外接圆的直径.
这似乎有点小题大做使用光线投射,或清盘数量确定这一点,对于这样一个简单的例子,目前我看找到行OA的角度(从水平)的选项,"正常化" (可能不是正确的词)它成为6个等边三角形中的一个,看看这个新点是否位于这个三角形内.
我觉得我错过了一些简单的东西,并且有一种简单而有效的方法(或者如果我真的很幸运,一个Java API).
谢谢你的帮助.
编辑:六边形的方向使得其中一个边与水平面平齐.
如果您将问题减少到检查{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).
您可以使用六边形的每个边的方程式; 通过它们,您可以了解给定点是否与六边形的中心位于同一半平面中.
例如,右上角有等式:
-sqrt(3)x - y + sqrt(3)/2 = 0
Run Code Online (Sandbox Code Playgroud)
插入点的坐标,然后插入中心的坐标.如果结果具有相同的符号,则该点位于左下半平面中(因此它可能位于六边形内).
然后,您可以使用其他方面的方程式重复.
请注意,此算法适用于任何凸多边形.
这就是我一直在使用的:
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是坐标系的坐标x和y投影到坐标系上,更容易检查边界.
