簡體   English   中英

如何“充氣”(如矩形)或縮放六邊形

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM