如何“充气”(如矩形)或缩放六边形

时间:2019-05-22 23:42:19

标签: c# math matrix graphics

我目前正在使用一个充满六边形网格的项目。每个六角形都具有完全相同的大小,我正在为它们绘制边框。

2 个答案:

答案 0 :(得分:1)

要使其与矩阵配合使用,您必须从单位矩阵X转换矩阵以将多边形的中心移至原点(0,0)X缩放矩阵以缩放矩阵。基于比率X a转换矩阵将坐标稍小(或更大),以将坐标移回它们开始之前的位置。然后,您可以将结果矩阵应用于每个坐标(作为矢量),然后将它们分别转换。

如果要对大量坐标运行许多相同的变换,则该矩阵很有用,因为您只需计算一次矩阵,然后快速将其应用于许多向量。在这种情况下,您只有6个向量(坐标),因此不会为您节省太多。您将整数添加到坐标的方法将运行得更快,并且只要将其封装为一个很好命名且可重复使用的方法即可,例如GetInlayPolygonForTile()可读性强。

答案 1 :(得分:1)

有几种方法可以解决此问题。让我们先简单一点:

  • 您可以从一开始就以正确的尺寸和位置创建六边形。这很简单,至少在需要对称多边形的情况下。

让我们看看:

List<PointF> Polygon(PointF center, int count, float radius, float angle)
{
    List<PointF> pts = new List<PointF>();
    for (float i = angle; i < 360; i+= 360f/count)
    {
        float rad = (float)(Math.PI / 180 * i);
        pts.Add(new PointF(center.X + (float)Math.Sin(rad) * radius,
                            center.Y + (float)Math.Cos(rad) * radius));
    }
    return pts;
}

这使您可以选择中心位置,对称性,大小和起始角度。要使高度为(99,99)的六边形指向160,请使用以下调用:

List<PointF> points = Polygon(new PointF(99, 99), 6, 80, 0);
  • 或者您可以变换给定的多边形。为此,您可以使用任何多边形(或任何点集),但是您可以定义图形的中心并计算所需的缩放系数。

要在两个轴上使用1.25f的因子并以(40,10)进行平移,请使用以下方法:

var points2 = points.ToArray();  // create a copy
using (Matrix m = new Matrix())
{
    m.Scale(1.25f, 1.25f, MatrixOrder.Append);
    m.Translate(40, 10, MatrixOrder.Append);
    m.TransformPoints(points2);
}

结果:

hexagons

请注意,要创建常规网格,您可能会使用第一种方法用更少的代码来摆脱困境。

让我们绘制一个六边形网格:

int r = 80;
float w = (float)(Math.Sin(Math.PI / 180 * 60) * r);
float h = (float)(Math.Cos(Math.PI / 180 * 60) * r);

for (int i = 0; i < 4; i++)
{
    e.Graphics.ResetTransform();
    e.Graphics.TranslateTransform(0, (r * 2  + h * 2)  * i);
    for (int j = 0; j < 4; j++)
    {
        e.Graphics.TranslateTransform(w * 2, 0);
        e.Graphics.DrawPolygon(Pens.Green, points.ToArray());
        e.Graphics.TranslateTransform(w, r + h);
        e.Graphics.DrawPolygon(Pens.Green, points.ToArray());
        e.Graphics.TranslateTransform(-w, -r- h );
    }
}

结果:

hex-grid