Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/103: Рейтинг темы: голосов - 103, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 02.06.2017
Сообщений: 11

Рисование многоугольника

05.06.2017, 17:30. Показов 19879. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Нужно написать программу, которая будет рисовать правильный n-угольник, основываясь только на количестве вершин и длине стороны.

Подскажите, пожалуйста, код, который будет рисовать такой n-угольник. В качестве примера у меня есть такой код, но он не подходит, т.к. в качестве входных данных тут количество сторон, расстояние от центра и координат х, у:

C#
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Lab1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        int n; 
        int R; 
        Point Cntr; 
        Point[] p; 
        
        private void lineAngle(double angle)
        {
            double z = 0; int i = 0;
            while (i < n + 1)
            {
                p[i].X = Cntr.X + (int)(Math.Round(Math.Cos(z / 180 * Math.PI) * R));
                p[i].Y = Cntr.Y - (int)(Math.Round(Math.Sin(z / 180 * Math.PI) * R));
                z = z + angle;
                i++;
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            label7.Text = "";
            n = Convert.ToInt32(textBox1.Text);
            R = Convert.ToInt32(textBox2.Text);
            Cntr.X = Convert.ToInt32(textBox3.Text);
            Cntr.Y = Convert.ToInt32(textBox4.Text);
            if (n < 0 || R < 0)
                label7.Text = "Неверные входные данные!";
            else
            {
                p = new Point[n + 1];
                lineAngle((double)(360.0 / (double)n));
                int i = n;
                Graphics g = pictureBox1.CreateGraphics();
                while (i > 0)
                {
                    g.DrawLine(new Pen(Color.Black, 2), p[i], p[i - 1]);
                    i = i - 1;
                }
            }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = "0";
            textBox2.Text = "0";
            textBox3.Text = "0";
            textBox4.Text = "0";
            label7.Text = "";
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = null;
        }
    }
}
Заранее спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.06.2017, 17:30
Ответы с готовыми решениями:

Как реализовать рисование многоугольника (в общих чертах)
Здравствуйте! Нужно сделать вот что. Есть форма, на ней я тыкаю мышкой - появляется точка, дальше еще раз тыкаю мышкой - появляется еще...

Вращение многоугольника
Приветствую форумчане. Подскажите пожалуйста как отрисовать 3-х мерный многоугольник и вращать его? MVS 2010 c# Form

Построение многоугольника в DirectX
Я работаю на DirectX. Хочу построить сдвоенную шестиугольную пирамиду (это как взять 2 пирамиды, одну перевернуть и приклеить к основанию...

11
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
05.06.2017, 17:39
Многоугольник рисуется методом DrawPolygon, в который передаётся массив вершин
0
0 / 0 / 0
Регистрация: 02.06.2017
Сообщений: 11
05.06.2017, 18:10  [ТС]
Хорошо, а можно поподробнее с кодом? Попытался подставить этот метод в свой код. Но не понимаю, что нужно писать в lineAngle (это массив моих точек)?

C#
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
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 Lab4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        int n;
        Point[] p;
 
        private void lineAngle(double angle)
        {
            {
 
            }
        }
 
        public void DrawPolygonPoint(PaintEventArgs e)
        {
            Pen blackPen = new Pen(Color.Black, 3);
 
            Point point1 = new Point(50, 50);
            Point point2 = new Point(100, 25);
            Point point3 = new Point(200, 5);
            Point point4 = new Point(250, 50);
 
            Point[] curvePoints =
             {
                 point1,
                 point2,
                 point3,
                 point4,
             };
 
            e.Graphics.DrawPolygon(blackPen, curvePoints);
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = "0";
            textBox2.Text = "0";
            textBox3.Text = "0";
            textBox4.Text = "0";
            label7.Text = "";
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = null;
        }
    }
}
0
0 / 0 / 0
Регистрация: 02.06.2017
Сообщений: 11
05.06.2017, 18:48  [ТС]
Не распознает (Взято отсюда: Как нарисовать многоугольник командой DrawPolygon()?)

C#
1
        e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
05.06.2017, 19:11
Gardner17,
C#
1
using System.Drawing.Drawing2D;
0
0 / 0 / 0
Регистрация: 02.06.2017
Сообщений: 11
05.06.2017, 19:19  [ТС]
Да, сейчас заработало, но это, к сожалению, не то, что нужно Мне надо, чтобы в двух текстбоксах задавалось количество вершин и длина стороны, и по нажатию кнопки строился соответствующий многоугольник. А здесь он рисуется напрямую мышкой.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
05.06.2017, 22:30
Лучший ответ Сообщение было отмечено Gardner17 как решение

Решение

Gardner17,
C#
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
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
 
namespace WFCS1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            btnStart.Click += btnStart_Click; //подписываем метод btnStart_Click к событию клика по кнопке btnStart
            this.Paint += Form1_Paint; //подписываем метод Form1_Paint к событию перерисовки формы
        }
 
        List<Point> points = new List<Point>(); //список точек
        void btnStart_Click(object sender, EventArgs e) //обработка клика по кнопке btnStart
        {
            points.Clear();
            int count = int.Parse(tbCount.Text);  //текстбокс "Количество вершин"
            int length = int.Parse(tbLength.Text);//текстбокс "Длина стороны"
            double R = length / (2 * Math.Sin(Math.PI / count)); //Радиус описанной окружности
            for (double angle = 0.0; angle <= 2 * Math.PI; angle += 2 * Math.PI / count) //цикл по углу
            {
                int x = (int)(R * Math.Cos(angle)); //расчет координаты x точки
                int y = (int)(R * Math.Sin(angle)); //расчет координаты y точки
                points.Add(new Point((int)R + x, (int)R + y)); //добавление точки в список точек
            }
            this.Invalidate(); //Команда перерисовать форму
        }
 
        void Form1_Paint(object sender, PaintEventArgs e) //обработка события перерисовывания формы
        {
            e.Graphics.SmoothingMode = SmoothingMode.HighQuality; //Задаем качество отрисовки
            if (points.Count >= 3) //если в списке 3 и более точек
                e.Graphics.DrawPolygon(Pens.Red, points.ToArray()); //рисуем полигон по точкам из списка points
        }
    }
}
1
0 / 0 / 0
Регистрация: 02.06.2017
Сообщений: 11
06.06.2017, 07:20  [ТС]
Просто нереально благодарен! Огромное СПАСИБО! И отдельное спасибо за то, что прокомментировали каждую строчку. Еще раз благодарю
0
0 / 0 / 0
Регистрация: 31.05.2019
Сообщений: 11
02.11.2019, 21:53
можно с формой загрузить в сайт??
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
03.11.2019, 01:40
CppSF, куда именно?и что "это именно" умеет?
0
0 / 0 / 0
Регистрация: 31.05.2019
Сообщений: 11
03.11.2019, 16:25
я говорю про этот код. Спрашиваю можно исходик от этого прога
Цитата Сообщение от Даценд Посмотреть сообщение
Gardner17,
C#Выделить код

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace WFCS1
{
* * public partial class Form1 : Form
* * {
* * * * public Form1()
* * * * {
* * * * * * InitializeComponent();
* * * * * * btnStart.Click += btnStart_Click; //подписываем метод btnStart_Click к событию клика по кнопке btnStart
* * * * * * this.Paint += Form1_Paint; //подписываем метод Form1_Paint к событию перерисовки формы
* * * * }
List<Point> points = new List<Point>(); //список точек
* * * * void btnStart_Click(object sender, EventArgs e) //обработка клика по кнопке btnStart
* * * * {
* * * * * * points.Clear();
* * * * * * int count = int.Parse(tbCount.Text); *//текстбокс "Количество вершин"
* * * * * * int length = int.Parse(tbLength.Text);//текстбокс "Длина стороны"
* * * * * * double R = length / (2 * Math.Sin(Math.PI / count)); //Радиус описанной окружности
* * * * * * for (double angle = 0.0; angle <= 2 * Math.PI; angle += 2 * Math.PI / count) //цикл по углу
* * * * * * {
* * * * * * * * int x = (int)(R * Math.Cos(angle)); //расчет координаты x точки
* * * * * * * * int y = (int)(R * Math.Sin(angle)); //расчет координаты y точки
* * * * * * * * points.Add(new Point((int)R + x, (int)R + y)); //добавление точки в список точек
* * * * * * }
* * * * * * this.Invalidate(); //Команда перерисовать форму
* * * * }
void Form1_Paint(object sender, PaintEventArgs e) //обработка события перерисовывания формы
* * * * {
* * * * * * e.Graphics.SmoothingMode = SmoothingMode.HighQuality; //Задаем качество отрисовки
* * * * * * if (points.Count >= 3) //если в списке 3 и более точек
* * * * * * * * e.Graphics.DrawPolygon(Pens.Red, points.ToArray()); //рисуем полигон по точкам из списка points
* * * * }
* * }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.11.2019, 16:25
Помогаю со студенческими работами здесь

Волновая заливка многоугольника
Здравствуйте. Есть проблема - нужно реализовать волновой алгоритм заливки многоугольника. Реализовать - реализовал, но не работает....

Скруглить улгы многоугольника
На форме я ставлю точки и рисую по ним полигон, затем &quot;обрезаю&quot; углы, чтобы потом туда нарисовать дугу. И вроде бы все рассчитал, но все...

Mousemove, перетягивание многоугольника
Скажите пожалуйста, как мне реализовать метод MoveBy - перетягивание многоугольника. Я питалася делать методы для определения является ли...

Ошибка в алгоритме рисования многоугольника
Вообще по проэкту надо сделать так, чтобы пользователь мог крутить 3Д призму, но я начал с нарисовки многоугольника.Количество граней...

Скруглить углы многоугольника (полигона)
В общем есть задание построить многоугольник любой формы и закруглить его углы. Есть часть кода на построение многоугольника любой формы,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru