Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
 Аватар для Оксана 1234
4 / 4 / 3
Регистрация: 10.04.2013
Сообщений: 172

Вращение отрезка на заданный угол

13.06.2015, 22:55. Показов 3701. Ответов 4
Метки нет (Все метки)

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 private void rotate_Click(object sender, EventArgs e)
        {
            begin.X = Convert.ToInt32(txt_x.Text.ToString());
            begin.Y = Convert.ToInt32(txt_y.Text.ToString());
            double alpha = Convert.ToDouble(txt_alpha.Text.ToString());
            int x = Convert.ToInt32(txt_x1.Text.ToString());
            int y = Convert.ToInt32(txt_y1.Text.ToString());
            Point p = rotate_a(new Point(x, y), alpha);
            System.Drawing.Graphics g = this.CreateGraphics();
            g.DrawLine(new Pen(Color.Red, 2), p, begin);
        }
 
        private Point rotate_a(Point point, double angle)
        {
            Point rotated_point = new Point();
            rotated_point.X = Convert.ToInt32(point.X * Math.Cos(angle) - point.Y * Math.Sin(angle)) ;
            rotated_point.Y = Convert.ToInt32(point.X * Math.Sin(angle) + point.Y * Math.Cos(angle)) ;
            return rotated_point;
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.06.2015, 22:55
Ответы с готовыми решениями:

Вращение отрезка
Вращаются два отрезка, каждый вокруг своей концевой точки. Предусмотреть возможность изменения скорости вращения каждого отрезка отдельно. ...

Вращение круга вокруг заданной точки на заданный угол
алгоритм вычисления???

Разработать алгоритм и программу, определяющую длину отрезка и угол наклона отрезка к оси X (в градусах)
Добрый день! Поможете написать программку на плюсах, вот задание: Отрезок на плоскости задан координатами своих концов. Разработать...

4
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
14.06.2015, 09:11
C#
1
g.Flush();
в конце обрабочика клика попробуйте написать.
1
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
14.06.2015, 12:54
Лучший ответ Сообщение было отмечено Оксана 1234 как решение

Решение

Оксана 1234,
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
using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace WindowsFormsApplication296
{
    public partial class Form1 : Form
    {
        private Segment segment;
 
        public Form1()
        {
            InitializeComponent();
 
            segment = new Segment(100, 100, 160, 180);
 
            var bt = new Button() {Parent = this, Text = "Rotate"};
            bt.Click += bt_Click;
        }
 
        void bt_Click(object sender, EventArgs e)
        {
            segment.Rotate(45*Math.PI/180f);
            Invalidate();
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.DrawLine(Pens.Red, segment.Start, segment.End);
        }
    }
 
    class Segment
    {
        public PointF Start;
        public PointF End;
 
        public Segment(float x1, float y1, float x2, float y2)
        {
            Start = new PointF(x1, y1);
            End = new PointF(x2, y2);
        }
 
        public void Rotate(double angle)
        {
            var pp = new PointF(End.X - Start.X, End.Y - Start.Y);
            var x = pp.X * Math.Cos(angle) - pp.Y * Math.Sin(angle);
            var y = pp.X * Math.Sin(angle) + pp.Y * Math.Cos(angle);
 
            End = new PointF((float)x + Start.X, (float)y + Start.Y);
        }
    }
}
1
 Аватар для Оксана 1234
4 / 4 / 3
Регистрация: 10.04.2013
Сообщений: 172
14.06.2015, 15:32  [ТС]
То есть без OnPaint невозможно реализовать рисования линии ?
Каждый раз , когда мы нажимаем на поворот отрезка вызывается OnPaint , потому что когда делаю пошаговое выполнение туда не заходит ?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
14.06.2015, 16:04
Лучший ответ Сообщение было отмечено Оксана 1234 как решение

Решение

Цитата Сообщение от Оксана 1234 Посмотреть сообщение
То есть без OnPaint невозможно реализовать рисования линии ?
Каждый раз , когда мы нажимаем на поворот отрезка вызывается OnPaint , потому что когда делаю пошаговое выполнение туда не заходит ?
Оксана 1234, Лично вам я уже писал код в другом посте, а вы снова спрашиваете про этот OnPaint.
Разберитесь наконец как происходит отрисовка в winforms!

В windows нельзя вот просто так взять и нарисовать что-либо на экране. Все работает по-другому.
Windows содержит в себе окна. Если ОС хочет отрисовать какое-либо окно, она вызывает у него метод OnPaint. В этом методе она просит окошко себя прорисовать на канве(объект Graphics).
Обратите внимание на два момента:
1) То что отрисовано в onPaint нигде не хранится, кроме как на экране. И если вы например, повозите поверх окна другое окно, то будет снова вызван метод OnPaint для того, что бы окно снова себя нарисовало.
2) Вы не можете сказать windows - а ну-ка нарисуй мне что-то на экране. Потому что когда и что рисовать принимает решение сама ОС. Поэтому вам нужно сообщить ОС, что ваше окно изменилось и не мешало бы перерисоваться. Для этого существует метод Invalidate() , который говорит windows о том, что содержимое данного окна уже не актуально и нужно его перерисовать.
Когда windows получает сигнал Invalidate(), она посылает сообщение в окно, что бы оно отрисовалось. Но отрисовка происходит не сразу. Она завязана на видеокарту и происходит тогда, когда видеокарта будет отрисовывать следующий кадр.

Таким образом, если мы хотим что то рисовать на экране, нужно сделать следующие вещи:
1) Создать объекты данных, которые мы будем отрисовывать. В вашем случае это объект Segment.
2) Написать свой код отрисовки в OnPaint. Этот метод должен отрисовывать наши объекты на канве Graphics.
3) Изменить состояние объекта данных (в вашем случае это segment) и вызвать метод Invalidate, что бы сообщить ОС, что мы хотим перерисоваться. После чего Windows вызовет OnPaint, который и сделает фактическую отрисовку.

Цитата Сообщение от Оксана 1234 Посмотреть сообщение
потому что когда делаю пошаговое выполнение туда не заходит ?
Оно туда не заходит, потому что окно свернуто и windows не вызывает для него OnPaint. Зачем его вызывать, если окно все равно не видно?
Если вы хотите отладить метод OnPaint, вам нужно поставить туда точку останова, а затем переклюиться на окно приложения. Как только вы переключитесь, windows вызовет метод OnPaint, и сработает точка останова.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.06.2015, 16:04
Помогаю со студенческими работами здесь

Вращение отрезка
Подскажите как осуществить вращение отрезка по градусам вокруг начальной точки (MoveTo(40,100)), градус вращения пользователь выбирает в...

Вращение отрезка
Осуществить вращение отрезка вокруг центра не совпадающего с центром на СИ

вращение отрезка.
осуществить вращение отрезка вокруг центра, лежащего внутри отрезка и не совпадающего с его центром

Вращение отрезка вокруг точки
Здравствуйте, помогите с заданием, никогда не работала с графикой и свойствами подобных объектов на языке си... Данную задачу могу...

Вращение отрезка вокруг точки
Как осуществить вращение отрезка вокруг точки?


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru