我想在我的代码中实现一个简单的函数来获取一个像素坐标列表,这些像素坐标位于一个中心点(x,y或线性RGBA字节数组,但也是线性RGBA字节数组)的一个(假设的)六边形中。可以稍后转换。)
也许这是一个我没有想过的简单解决方案。你能想出一个巧妙的方法来实现这个吗?
答案 0 :(得分:0)
您真正需要的只是六边形的一个象限中的像素列表。然后你可以简单地“反射”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));
}
}
我通过trig和代数知道我六边形的最右边点是(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);
}
它可能很粗糙,但这个概念应该有用。