我目前正在使用一个充满六边形网格的项目。每个六角形都具有完全相同的大小,我正在为它们绘制边框。
答案 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);
}
结果:
请注意,要创建常规网格,您可能会使用第一种方法用更少的代码来摆脱困境。
让我们绘制一个六边形网格:
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 );
}
}
结果: