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

Создание анимации двух объектов

20.06.2019, 11:23. Показов 1794. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, в университете получил задание построить график кривой и воспроизвести анимацию его построения при заданных параметрах(фото 1 и 2) саму анимацию построения кривой с помощью timer_tick и DrawEllipse у меня худо бедно получилось, но мне нужно добавить ещё синий квадрат, проблема в том что я не знаю как сделать чтобы квадрат постоянно обновлялся, а круг который строит кривую продолжал сохранятся, если добавляю Invalidate() обновляется вся форма. Помогите в этом вопросе.
Код анимации
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
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 Beta_prog
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private int x1, y1, x2, y2;
 
        private double a, t, fi;
 
        private Pen pen = new Pen(Color.DarkRed, 2);
        private Pen k = new Pen(Color.Blue, 2);
        private void Form1_Load(object sender, EventArgs e)
 
        {
 
            x1 = ClientSize.Width / 2;
 
            y1 = ClientSize.Height / 2;
 
            a = 150;
 
            fi = -0.5;
 
            t = Math.Tan(fi);
 
            x2 = x1 + (int)((3 * a * t) / (1 + t * t * t));
 
            y2 = y1 - (int)((3 * a * t * t) / (1 + t * t * t));
        }
        private void Form1_Paint(object sender,
 
        PaintEventArgs e)
 
        {
 
            Graphics g = e.Graphics;
 
            g.DrawEllipse(pen, x2, y2, 20, 20);
 
        }
        private void timer1_Tick(object sender, EventArgs e)
 
        {
 
            fi += 0.01;
 
            t = Math.Tan(fi);
 
            x2 = x1 + (int)((3 * a * t) / (1 + t * t * t));
 
            y2 = y1 - (int)((3 * a * t * t) / (1 + t * t * t));
 
            this.CreateGraphics().DrawEllipse(pen, x2, y2, 20, 20);
            this.CreateGraphics().DrawEllipse(pen, x2, y2, 15, 15);
            this.CreateGraphics().DrawEllipse(pen, x2, y2, 10, 10);
            this.CreateGraphics().DrawEllipse(pen, x2, y2, 5, 5);
            this.CreateGraphics().DrawRectangle(k, x2, y2, 20, 20);
 
 
        }
 
    }
}
Миниатюры
Создание анимации двух объектов   Создание анимации двух объектов   Создание анимации двух объектов  

Создание анимации двух объектов  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.06.2019, 11:23
Ответы с готовыми решениями:

Создание двух объектов
Есть такая программа: public partial class Form1 : Form { private Object o; private int k = 0; int...

Создание анимации (gif)
Допустим имеем массив из ста картинок типа Image, можно ли из данного массива сделать gif анимацию и сохранить ее на комп.

Создание простой анимации
Как создать анимацию, к примеру программу показывающую скачущий мячик? Добавлено через 24 минуты Нужно с использованием таймера ...

5
384 / 184 / 107
Регистрация: 07.01.2016
Сообщений: 496
20.06.2019, 12:03
Toxin4ick, создайте список для хранения точек траектории. и каждый тик добавляйте в него текущую точку
0
0 / 0 / 0
Регистрация: 27.11.2018
Сообщений: 9
20.06.2019, 14:36  [ТС]
Не особо понимаю как это сделать, в c# начал работать 4 дня назад.
0
384 / 184 / 107
Регистрация: 07.01.2016
Сообщений: 496
20.06.2019, 19:16
Лучший ответ Сообщение было отмечено Toxin4ick как решение

Решение

Toxin4ick, там немного нужно подправить, чтобы заработало. новые строки кода пояснены с помощью комментариев
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
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 Beta_prog
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            DoubleBuffered = true; // чтобы не мерцало
            timer1.Start();
        }
        private int x1, y1, x2, y2;
 
        private double a, t, fi;
 
        private Pen pen = new Pen(Color.DarkRed, 2);
        private Pen k = new Pen(Color.Blue, 2);
        // список для хранения точек траектории
        private List<Point> _path = new List<Point>();
        private void Form1_Load(object sender, EventArgs e)
 
        {
 
            x1 = ClientSize.Width / 2;
 
            y1 = ClientSize.Height / 2;
 
            a = 150;
 
            fi = -0.5;
 
            t = Math.Tan(fi);
 
            x2 = x1 + (int)((3 * a * t) / (1 + t * t * t));
 
            y2 = y1 - (int)((3 * a * t * t) / (1 + t * t * t));
        }
        private void Timer1_Tick(object sender, EventArgs e)
        {
 
            fi += 0.01;
 
            t = Math.Tan(fi);
 
            x2 = x1 + (int)((3 * a * t) / (1 + t * t * t));
 
            y2 = y1 - (int)((3 * a * t * t) / (1 + t * t * t));
            Invalidate(); // перерисовать форму
            _path.Add(new Point(x2, y2)); // добавить текущую точку в список
        }
        protected override void OnPaint(PaintEventArgs e)
        {
 
            e.Graphics.Clear(this.BackColor); // закрасить цветом заднего фона
            // отрисовка всех точек пути
            foreach (var point in _path)
            {
                e.Graphics.DrawEllipse(pen, point.X, point.Y, 20, 20);
                e.Graphics.DrawEllipse(pen, point.X, point.Y, 15, 15);
                e.Graphics.DrawEllipse(pen, point.X, point.Y, 10, 10);
                e.Graphics.DrawEllipse(pen, point.X, point.Y, 5, 5);
            }
            e.Graphics.DrawRectangle(k, x2, y2, 20, 20); // отрисовка текущей точки
 
            base.OnPaint(e);
        }
 
    }
}
1
0 / 0 / 0
Регистрация: 27.11.2018
Сообщений: 9
24.06.2019, 13:44  [ТС]
alexus5 А как можно сделать чтобы анимация происходила на PictureBox, а то мне нужно ещё автоматическое масштабирование сделать при изменение окна, а разных видео и сайтах это делали через PictureBox или Panel.
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
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 WindowsFormsApp1
{
    public partial class Form1 : Form
    {
 
        public Form1()
        {
            InitializeComponent();
            DoubleBuffered = true; // чтобы не мерцало
            timer2.Start();
        }
        // Глобальные переменные 
 
        private int x1, y1, x2, y2;
 
        private double a=100, t, fi;
 
        private Pen pen = new Pen(Color.Black, 3);
        private Pen cartesian_sheet=new Pen(Color.Red, 2);
 
        private Pen Treanblue_square = new Pen(Color.Blue, 5);
 
        private List<Point> _path = new List<Point>();
        private void Button1_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Enabled == true)
            {
                pictureBox1.Enabled = false;
            }
            pictureBox1.Enabled = true;
            pictureBox1.Visible = true;
 
        }
 
        private void PictureBox1_Click(object sender, EventArgs e)
        {
 
        }
 
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            float W = pictureBox1.Width, H = pictureBox1.Height;
            float halfW = W / 2, halfH = H / 2;
            // оси координат
            e.Graphics.DrawLine(Pens.Gray, 0, 20, W, 20);
            e.Graphics.DrawLine(Pens.Gray, 0, 70, W, 70);
            e.Graphics.DrawLine(Pens.Gray, 0, 120, W, 120);
            e.Graphics.DrawLine(Pens.Gray, 0, 170, W, 170);
            e.Graphics.DrawLine(Pens.Gray, 0, 220, W, 220);
            e.Graphics.DrawLine(Pens.Gray, 0, 270, W, 270);
            e.Graphics.DrawLine(Pens.Gray, 0, 320, W, 320);
            e.Graphics.DrawLine(Pens.Gray, 0, 370, W, 370);
            e.Graphics.DrawLine(Pens.Gray, 0, 420, W, 420);
            e.Graphics.DrawLine(Pens.Gray, 0, 470, W, 470);
            e.Graphics.DrawLine(pen, 0, halfH, W, halfH);
            e.Graphics.DrawLine(Pens.Gray, 0, 570, W, 570);
            e.Graphics.DrawLine(Pens.Gray, 0, 620, W, 620);
            e.Graphics.DrawLine(Pens.Gray, 0, 670, W, 670);
            e.Graphics.DrawLine(Pens.Gray, 0, 720, W, 720);
            e.Graphics.DrawLine(Pens.Gray, 0, 770, W, 770);
            e.Graphics.DrawLine(Pens.Gray, 0, 820, W, 820);
            e.Graphics.DrawLine(Pens.Gray, 0, 870, W, 870);
            e.Graphics.DrawLine(Pens.Gray, 0, 920, W, 920);
            e.Graphics.DrawLine(Pens.Gray, 0, 970, W, 970);
            e.Graphics.DrawLine(Pens.Gray, 0, 1020, W, 1020);
            e.Graphics.DrawLine(Pens.Gray, 0, 1070, W, 1070);
            e.Graphics.DrawLine(Pens.Gray, 50, 0, 50, H);
            e.Graphics.DrawLine(Pens.Gray, 100, 0, 100, H);
            e.Graphics.DrawLine(Pens.Gray, 150, 0, 150, H);
            e.Graphics.DrawLine(Pens.Gray, 200, 0, 200, H);
            e.Graphics.DrawLine(Pens.Gray, 250, 0, 250, H);
            e.Graphics.DrawLine(Pens.Gray, 300, 0, 300, H);
            e.Graphics.DrawLine(Pens.Gray, 350, 0, 350, H);
            e.Graphics.DrawLine(Pens.Gray, 400, 0, 400, H);
            e.Graphics.DrawLine(Pens.Gray, 450, 0, 450, H);
            e.Graphics.DrawLine(Pens.Gray, 500, 0, 500, H);
            e.Graphics.DrawLine(Pens.Gray, 550, 0, 550, H);
            e.Graphics.DrawLine(Pens.Gray, 600, 0, 600, H);
            e.Graphics.DrawLine(Pens.Gray, 650, 0, 650, H);
            e.Graphics.DrawLine(Pens.Gray, 700, 0, 700, H);
            e.Graphics.DrawLine(Pens.Gray, 750, 0, 750, H);
            e.Graphics.DrawLine(Pens.Gray, 800, 0, 800, H);
            e.Graphics.DrawLine(Pens.Gray, 850, 0, 850, H);
            e.Graphics.DrawLine(Pens.Gray, 900, 0, 900, H);
            e.Graphics.DrawLine(pen, halfW, 0, halfW, H);
            e.Graphics.DrawLine(Pens.Gray, 1000, 0, 1000, H);//0.5
            e.Graphics.DrawLine(Pens.Gray, 1050, 0, 1050, H);//1
            e.Graphics.DrawLine(Pens.Gray, 1100, 0, 1100, H);//2
            e.Graphics.DrawLine(Pens.Gray, 1150, 0, 1150, H);
            e.Graphics.DrawLine(Pens.Gray, 1200, 0, 1200, H);
            e.Graphics.DrawLine(Pens.Gray, 1250, 0, 1250, H);
            e.Graphics.DrawLine(Pens.Gray, 1300, 0, 1300, H);
            e.Graphics.DrawLine(Pens.Gray, 1350, 0, 1350, H);
            e.Graphics.DrawLine(Pens.Gray, 1400, 0, 1400, H);
            e.Graphics.DrawLine(Pens.Gray, 1450, 0, 1450, H);
            e.Graphics.DrawLine(Pens.Gray, 1500, 0, 1500, H);
            e.Graphics.DrawLine(Pens.Gray, 1550, 0, 1550, H);
            e.Graphics.DrawLine(Pens.Gray, 1600, 0, 1600, H);
            e.Graphics.DrawLine(Pens.Gray, 1650, 0, 1650, H);
            e.Graphics.DrawLine(Pens.Gray, 1700, 0, 1700, H);
            e.Graphics.DrawLine(Pens.Gray, 1750, 0, 1750, H);
            e.Graphics.DrawLine(Pens.Gray, 1800, 0, 1800, H);
            e.Graphics.DrawLine(Pens.Gray, 1850, 0, 1850, H);
            e.Graphics.DrawLine(Pens.Gray, 1900, 0, 1900, H);
            // тангенс на интервале x=[-Pi..Pi]
            // проходим по всем точкам на форме, вычисляем x и y=tg(x)
 
            x1 = pictureBox1.Width / 2;
 
            y1 = pictureBox1.Height / 2;
 
            fi = -0.5;
 
                t = Math.Tan(fi);
 
                x2 = x1 + (int)((3 * a * t) / (1 + t * t * t));
 
                y2 = y1 - (int)((3 * a * t * t) / (1 + t * t * t));
 
            Graphics g = e.Graphics;
            e.Graphics.Clear(this.BackColor); // закрасить цветом заднего фона
            // отрисовка всех точек пути
            foreach (var point in _path)
            {
                /*e.Graphics.DrawEllipse(cartesian_sheet, point.X, point.Y, 20, 20);
                e.Graphics.DrawEllipse(cartesian_sheet, point.X, point.Y, 17, 17);
                e.Graphics.DrawEllipse(cartesian_sheet, point.X, point.Y, 15, 15);
                e.Graphics.DrawEllipse(cartesian_sheet, point.X, point.Y, 13, 13);
                e.Graphics.DrawEllipse(cartesian_sheet, point.X, point.Y, 10, 10);
                e.Graphics.DrawEllipse(cartesian_sheet, point.X, point.Y, 5, 5);*/
            }
            e.Graphics.DrawRectangle(Treanblue_square, x2, y2, 20, 20); // отрисовка текущей точки
            e.Graphics.DrawRectangle(Treanblue_square, x2, y2, 15, 15);
            e.Graphics.DrawRectangle(Treanblue_square, x2, y2, 10, 10);
            e.Graphics.DrawRectangle(Treanblue_square, x2, y2, 5, 5);
 
 
        }
 
        public void Timer2_Tick(object sender, EventArgs e)
        {
            x1 = pictureBox1.Width / 2;
 
            y1 = pictureBox1.Height / 2;
            fi += 0.005;
 
            t = Math.Tan(fi);
 
            x2 = x1 + (int)((3 * a * t) / (1 + t * t * t));
 
            y2 = y1 - (int)((3 * a * t * t) / (1 + t * t * t));
 
            Invalidate(); // перерисовать форму
            _path.Add(new Point(x2, y2)); // добавить текущую точку в список
        }
 
 
 
        protected override void OnPaint(PaintEventArgs e)
        {
 
            e.Graphics.Clear(this.BackColor); // закрасить цветом заднего фона
            // отрисовка всех точек пути
            foreach (var point in _path)
            {
                e.Graphics.DrawEllipse(cartesian_sheet, point.X, point.Y, 10, 10);
                e.Graphics.DrawEllipse(cartesian_sheet, point.X, point.Y, 7, 7);
                e.Graphics.DrawEllipse(cartesian_sheet, point.X, point.Y, 3, 3);
                e.Graphics.DrawEllipse(cartesian_sheet, point.X, point.Y, 1, 1);
            }
            e.Graphics.DrawRectangle(Treanblue_square, x2, y2, 20, 20); // отрисовка текущей точки
            e.Graphics.DrawRectangle(Treanblue_square, x2, y2, 15, 15);
            e.Graphics.DrawRectangle(Treanblue_square, x2, y2, 10, 10);
            e.Graphics.DrawRectangle(Treanblue_square, x2, y2, 5, 5);
            base.OnPaint(e);
        }
 
 
 
        private void TrackBar1_Scroll(object sender, EventArgs e)
        {
            if (trackBar1.Value == 0)
            {
                a = 0;
            }
            if (trackBar1.Value == 1)
                {
                a = 100;
            }
            if (trackBar1.Value == 2)
            {
                a = 200;
            }
            if (trackBar1.Value == 3)
            {
                a = 300;
            }
            if (trackBar1.Value == 4)
            {
                a = 400;
            }
            if (trackBar1.Value == 5)
            {
                a =  500;
            }
        }
    }
 
}
0
384 / 184 / 107
Регистрация: 07.01.2016
Сообщений: 496
24.06.2019, 14:59
Цитата Сообщение от Toxin4ick Посмотреть сообщение
чтобы анимация происходила на PictureBox
нужно поместить отрисовку в обработчик Paint соответствующего PictureBox
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.06.2019, 14:59
Помогаю со студенческими работами здесь

Создание анимации вращения пропеллера на Visual C#
Помогите пожалуйста с проблемой. Пока есть только код вращения линии. Можите предложить идеи или решения по реализации проекта? using...

C # привязка contextMenuStrip1 до двух объектов
У меня есть программа для исследования методов представления бинарных отношений и операций над ними. На форме находится два компонента...

Одновременное движение двух объектов (на клавиатуре)
Всем доброго времени суток! В общем-то сабж - столкнулся с проблемой, что два игрока не могут одновременно передвигать своих персонажей:...

Объединения двух и более списков объектов по дате
здравствуйте, столкнулся вот с такой проблемой, есть у меня класс, содержащий два свойства DateValue(Дата типа DateTime) и Value (Значение...

Создание дерева объектов на C#
Задача такая: имеется объектная модель(напоминает xml) TypeA Данные этого типа содержат поля: •Name – текстовое поле •Capacity –...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru