Есть несколько подходов к проблеме. Давайте сначала упростим:
- Вы можете создать шестиугольник в нужном размере и месте с самого начала. Это просто, по крайней мере, если вы хотите симметричные многоугольники.
Посмотрим:
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 );
}
}
Результат: