选择围绕中心点的六边形中的像素
本文关键字:六边形 像素 中心点 选择 | 更新日期: 2023-09-27 17:58:05
我想在我的代码中实现一个简单的函数,以获取像素坐标列表,这些像素坐标位于围绕中心点(x,y 或线性 RGBA 字节数组,但我可以稍后转换(的(假设(六边形中。
也许有一个简单的解决方案我没有想到。你能想到一种巧妙的方法来实现这一点吗?
您真正需要的只是六边形一个象限中的像素列表。然后,您可以简单地"反射"x和y坐标以获得完整的六边形(当然受屏幕边界的限制(。
首先,我会断言我希望我的一个六边形边水平对齐。我还会假设"我的六边形的大小"是指从我的六边形中心到底部(水平对齐(的垂直线的长度(我们称之为 L(。然后,我会在大小为 L 的这种对齐的六边形上进行代数和三角运算,假设原点 (0,0( 是我的中心点。
我知道,那么[0,0,L/sqrt(3),L]
范围内的所有点(即 [x 偏移、y 偏移、宽度、高度](肯定在我的六边形内。因此,请将所有这些要点添加到我的列表中。
List<Point> pointsInHexagonQuadrant = new List<Point>();
for (int i = 0; i < L/Math.Sqrt(3); i++) //I'm ignoring any casting, you may have to fix.
{
for (int j = 0; j <= L; j++)
{
pointsInHexagonQuadrant.Add(new Point(i,j));
}
}
通过三角和代数,我知道我的六边形的最右点在 (2*L/sqrt(3(,0(,从 L/sqrt(3( 到 2*L/sqrt(3(,六边形倾斜边的方程是 y=sqrt(3)*x-2*L
。我想要所有 y 坐标小于该坐标的点。
for(int i = L/Math.Sqrt(3); i <= 2*L/Math.Sqrt(3); i++)
{
for (int j = 0; j <= Math.Sqrt(3)*i-2*L; j++)
{
pointsInHexagonQuadrant.Add(new Point(i,j));
}
}
添加这个点,你就有六边形的一个象限,如下所示:
(0,0) (2L/sqrt(3),0)
---------------
| /
| /
| /
| /
| /
|-------/
(0,L) (L/sqrt(3),L)
要获得完整的六边形,您需要在 x 轴和 y 轴上"反射"......
List<Point> pointsInMyHexagon = new List<Point>();
foreach (Point p in pointsInHexagonQuadrant)
{
pointsInMyHexagon.Add(new Point(p.X,p.Y));
pointsInMyHexagon.Add(new Point(-p.X,p.Y));
pointsInMyHexagon.Add(new Point(p.X,-p.Y));
pointsInMyHexagon.Add(new Point(-p.X,-p.Y));
}
现在偏移六边形以将中心放回 (x,y( 点上。
foreach (Point p in pointsInMyHexagon)
{
p.Offset(myCenterPoint.X, myCenterPoint.Y);
}
它可能很粗糙,但这个概念应该有效。