Правильные полигоны
Рисование полигонов в C# относительно легко благодаря GDI+. Что касается рисования правильных многоугольников (полигонов с ребрами одинакового размера), то это становится немного сложнее, потому что нам нужно вычислить вершины многоугольников.
Математике
Математика для правильного многоугольника не слишком сложна. Поскольку каждая из сторон имеет одинаковую длину, это означает, что угол от центра многоугольника до каждой вершины в ребре одинаков для каждого ребра.
Таким образом, мы можем вычислить внутренний угол каждого ребра, погрузив общее количество градусов в окружности (360) на количество сторон. Таким образом, для нашего примера выше, пятиугольник (5-сторонний многоугольник) будет иметь внутренние углы 360/5 = 72 градуса.
Как рассчитать вершины под внутренним углом?
В качестве аргументов функция принимает начало координат (центр многоугольника), радиус и градус. Функция просто использует тригонометрию, чтобы выяснить, как долго гипотенуза прямоугольного треугольника будет начинаться в начале под заданным углом. Вы можете посмотреть код по ссылке выше или в примере проекта внизу страницы.
Теперь очень легко вычислить вершины многоугольника. С помощью простой петли мы можем использовать градус для координатной функции на каждом угловом интервале.
Рисование
Нарисовать многоугольник на изображении так же просто, как использовать функцию DrawPolygon в классе System.Drawing.Graphics
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace RegularPolygon { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void BtnDraw_Click(object sender, EventArgs e) { int sides = (int)nSides.Value; int radius = (int)nRadius.Value; int angle = (int)nAngle.Value; Point center = new Point(picCanvas.Width / 2, picCanvas.Height / 2); Image disposeMe = picCanvas.Image; picCanvas.Image = DrawRegularPolygon(sides, radius, angle, center, picCanvas.ClientSize); if (disposeMe != null) disposeMe.Dispose(); } private Bitmap DrawRegularPolygon(int sides, int radius, int startingAngle, Point center, Size canvasSize) { //Получение местоположения для каждой вершины многоугольника Point[] verticies = CalculateVertices(sides, radius, startingAngle, center); // Рендеринг полигона Bitmap polygon = new Bitmap(canvasSize.Width, canvasSize.Height); using (Graphics g = Graphics.FromImage(polygon)) { g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.DrawPolygon(Pens.Black, verticies); } return polygon; } private Point[] CalculateVertices(int sides, int radius, int startingAngle, Point center) { if (sides < 3) throw new ArgumentException("Полигон должен иметь 3 стороны и более."); List<Point> points = new List<Point>(); float step = 360.0f / sides; float angle = startingAngle; //начальный угол for (double i = startingAngle; i < startingAngle + 360.0; i += step) //идти по кругу { points.Add(DegreesToXY(angle, radius, center)); angle += step; } return points.ToArray(); } private Point DegreesToXY(float degrees, float radius, Point origin) { Point xy = new Point(); double radians = degrees * Math.PI / 180.0; xy.X = (int)(Math.Cos(radians) * radius + origin.X); xy.Y = (int)(Math.Sin(-radians) * radius + origin.Y); return xy; } } } |
Так же вам потребуется разместить на форме pictureBox и четыре контрола numericUpDown, ну конечно button
Заключительные замечания
Мало что стоит отметить. Прежде всего, функция возвращает объекты Point, в зависимости от того, насколько точным должен быть полигональный рисунок, вместо этого вы можете использовать PointF.
Для математики все углы находятся в градусах и идут против часовой стрелки, начиная с нуля в самой правой средней точке круга.