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

Поворот многоугольника на заданный угол

10.10.2015, 20:25. Показов 3658. Ответов 6

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Требуется повернуть заданный многоугольник на угол (вводит пользователь)
C#
1
2
3
4
5
6
 double angle = Convert.ToDouble(textBox8.Text); // угол поворота, вводит пользователь
            for(int i = 0; i < n; i++)
            {
                p[i].X = Convert.ToInt32(p[i].X * Math.Cos(angle) + p[i].Y * Math.Sin(angle));
                p[i].Y = Convert.ToInt32(p[i].X * Math.Sin(angle) - p[i].Y * Math.Cos(angle));
             }
Подскажите что в этой формуле не так, может чего-то не хватает?
int n;//количество сторон
int R;//расстояние от центра до стороны
Point Cntr;//центр
Point[] p; //массив точек будущего многоугольника
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.10.2015, 20:25
Ответы с готовыми решениями:

Поворот рисунка на заданный угол
private void button3_Click(object sender, EventArgs e) { Реактор re = new Реактор(300, 50, 50, 30); ...

Поворот изображения на заданный угол
Добрый вечер. Помогите, пожалуйста, понять что я не так делаю. Задача заключается в повороте на заданный угол. Угол вводится...

Поворот многоугольника
Доброго времени суток! У меня проблема возникла. Рисую на панели многоугольник, и имеется возможность его вращать вокруг центра! но...

6
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
10.10.2015, 22:39
Для ясности напишите код в полном объёме.
0
0 / 0 / 0
Регистрация: 16.10.2014
Сообщений: 9
11.10.2015, 00:17  [ТС]
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
        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)
        {
            label10.Text = "";
            //получаем входные данные и проверяем их на корректность
            n = Convert.ToInt32(textBox4.Text);
            R = Convert.ToInt32(textBox5.Text);
            Cntr.X = Convert.ToInt32(textBox6.Text);
            Cntr.Y = Convert.ToInt32(textBox7.Text);
            if (n < 0 || R < 0)
                label10.Text = "Неверные входные данные!";
            else //входные данные корректны, рисуем многоугольник
            {
                p = new Point[n + 1];
                lineAngle((double)(360.0 / (double)n));
                int i = n;
                Graphics g = pictureBox2.CreateGraphics();
                while (i > 0)
                {
                    g.DrawLine(new Pen(Color.AliceBlue, 6), p[i], p[i - 1]);
                    i = i - 1;
                }
            }
        }
 
        //оставляем нарисованный многоугольник, обнуляем входные значения для нового ввода
        private void button2_Click(object sender, EventArgs e)
        {
            textBox4.Text = "0";
            textBox5.Text = "0";
            textBox6.Text = "0";
            textBox7.Text = "0";
            label10.Text = "";
 
        }
        //стираем всё нарисованное, не обнуляя последние входные данные
        private void button3_Click(object sender, EventArgs e)
        {
            pictureBox2.Image = null;
            label10.Text = "";
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            double angle = Convert.ToDouble(textBox8.Text);
            for(int i = 0; i < n; i++)
            {
                p[i].X = Convert.ToInt32(p[i].X * Math.Cos(angle) + p[i].Y * Math.Sin(angle));
                p[i].Y = Convert.ToInt32(p[i].X * Math.Sin(angle) - p[i].Y * Math.Cos(angle));
                // System.Threading.Thread.Sleep(3500);
            }
        }
    }
}
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
11.10.2015, 01:13
daria_vitf, Вы же после поворота многоугольника никак его не отрисовываете.
0
0 / 0 / 0
Регистрация: 16.10.2014
Сообщений: 9
11.10.2015, 01:44  [ТС]
т.е. снова сделать те же действия что и для первой кнопки?
0
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
12.10.2015, 03:10
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
namespace Многоугольник
{
    public partial class Form1 : Form
    {
        int n;//количество сторон
        int R;//расстояние от центра до стороны
        Point Cntr;//центр
        Point[] p; //массив точек будущего многоугольника
        //создаём массив точек нашего многоугольника
        double zRotate;// угол поворота
        public Form1()
        {
            InitializeComponent();
        }
        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 Rotate(double angle)
        {
            zRotate = Convert.ToDouble(textBox5.Text); int i = 0;
            while (i < n + 1)
            {
 
                p[i].X = Cntr.X + (int)(Math.Round(Math.Cos(zRotate / 180 * Math.PI) * R));
                p[i].Y = Cntr.Y - (int)(Math.Round(Math.Sin(zRotate / 180 * Math.PI) * R));
                zRotate = zRotate + angle;
                i++;
            }
        }
 
        private void button1_Click(object sender, EventArgs e)//рисуем
        {
            label1.Text = "";
            //получаем входные данные и проверяем их на корректность
            n = Convert.ToInt32(textBox3.Text);
            R = Convert.ToInt32(textBox4.Text);
            Cntr.X = Convert.ToInt32(textBox1.Text);
            Cntr.Y = Convert.ToInt32(textBox2.Text);
            if (n < 0 || R < 0)
                label1.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.Red, 6), 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";
            label1.Text = "";
        }
        //стираем всё нарисованное, не обнуляя последние входные данные
        private void button3_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = null;
            label1.Text = "";
        }
 
        //При нажатии button4 фигура поворачиваеться на заданный угол zRotate
        private void button4_Click(object sender, EventArgs e)
        {
              
            p = new Point[n + 1];
            Rotate((double)(360.0 / (double)n));
            int i = n;
            Graphics g = pictureBox1.CreateGraphics();
            while (i > 0)
            {
                g.DrawLine(new Pen(Color.Red, 6), p[i], p[i - 1]);
 
                i = i - 1;
            }
        }          
    }
}
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
12.10.2015, 09:23
Поворот можно делать с помощью матрицы аффинных преобразований:
C#
1
2
3
4
5
6
void RotatePolygon(PointF[] points, float angle, PointF center) {
    using (Matrix m = new Matrix()) {
        m.RotateAt(angle, center);
        m.TransformPoints(points);
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.10.2015, 09:23
Помогаю со студенческими работами здесь

Поворот эллипса на заданный угол
Используя формулы поворота на заданный угол относительно заданной точки получить поворот эллипса на заданный угол. Помогите сделать...

Поворот линии на заданный угол
Добрый день. Помогите с таким вопросом, как можно введя в (Edit1.text) произвольный угол от 0 до 360, после чего линия повернётся от...

Поворот на заданный угол в радианах
Вроде бы такое должно реализовываться просто, но ни в какую не могу догадаться. Допустим, имеем значение поворота 3.1, нужно повернуть его...

Поворот вектора на заданный угол
{B}_{x}={A}_{x}cos\varphi - {A}_{y}\sin \varphi {B}_{y}={A}_{x}sin\varphi - {A}_{y}\cos \varphi это поворот по часовой? как изменится...

Поворот imageView на заданный угол
народ! как можно повернуть imageView на заданный угол?


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru