[英]How to “Inflate” (like in rectangle) or scale a hexagon
我目前正在使用填充有六邊形的網格進行項目。 每個六角形都具有完全相同的大小,我正在為它們每個繪制一個邊框。
為了使它能夠與矩陣一起使用,您必須從單位矩陣X轉換矩陣以將多邊形的中心移至原點(0,0)X縮放矩陣以將坐標縮放得更小,從而構建矩陣(或更大)基於比率X的轉換矩陣,以將坐標移回它們開始之前的位置。 然后,您可以將結果矩陣應用於每個坐標(作為矢量),然后將它們分別轉換。
如果您要對大量坐標運行許多相同的變換,則該矩陣很有用,因為您只需計算一次矩陣即可快速將其應用於許多向量。 在這種情況下,您只有6個向量(坐標),因此不會為您節省太多。 您將整數添加到坐標的方法將運行得更快,並且只要將其封裝為一個很好命名且可重用的方法(例如GetInlayPolygonForTile()
,它將易於閱讀。
有幾種解決該問題的方法。 讓我們先簡單一點:
讓我們來看看:
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
並平移( 1.25f
),請使用以下命令:
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 );
}
}
結果:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.