【问题标题】:Select pixels in a hexagon around a center point选择中心点周围的六边形像素
【发布时间】:2014-04-14 02:05:22
【问题描述】:

我想在我的代码中实现一个简单的函数来获取像素坐标列表,这些坐标位于中心点(x,y 或线性 RGBA 字节数组,但我可以稍后转换)。

也许有一个我没有想过的简单解决方案。你能想出一个巧妙的方法来实现它吗?

【问题讨论】:

  • 你现在的解决方案有什么问题?
  • 我还没有解决方案。我只是以圆形方式抓取像素,但想要一个六边形。

标签: c# pixel hexagonal-tiles


【解决方案1】:

您真正需要的只是六边形一个象限中的像素列表。然后,您可以简单地“反映”x 和 y 坐标以获得完整的六边形(当然取决于屏幕边界)。

首先,我会断言我希望我的六边形边水平对齐。我还会假设“我的六边形的大小”是指从我的六边形中心到底边(水平对齐)的垂直线的长度(我们称之为 L)。然后,假设原点(0,0)是我的中心点,我会在这个对齐的六边形上做代数和三角函数,大小为 L。

我知道,那么在[0,0,L/sqrt(3),L] 范围内的所有点(即 [x-offset, y-offset, width, height])肯定都在我的六边形内。因此,将所有这些要点添加到我的列表中。

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);
}

这可能很粗略,但这个概念应该可行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    相关资源
    最近更新 更多