Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
4 / 4 / 0
Регистрация: 26.09.2012
Сообщений: 144
1

Как сделать плавное перемещение нарисованной фигуры по форме?

24.04.2015, 00:39. Показов 4924. Ответов 5
Метки нет (Все метки)

Здравствуйте, у меня есть задача: Передвижение фигур.
Вообщем выполняю её так: создаю стартовую фигуру, указываю куда она должна переместится и после циклом (стираю все поле, рисую фигуру на пиксель дальше, стираю поле, рисую на пиксель дальше) пока она не достигнет заданной координаты, но дело в том, что цикл обрабатывается очень быстро и я вижу нарисованную мною фигуру в начале, а потом сразу перемещенную на заданные координаты. Т.е. пропадает эффект её движения.
Посоветуйте что нибудь пожалуйста. Я думал как то увеличить время выполнения цикла, что бы он не так быстро это все обрабатывал.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2015, 00:39
Ответы с готовыми решениями:

Перемещение нарисованной фигуры по форме
Как осуществить перемещение фигуры? Например, квадрата.

Как сделать перемещение нарисованной фигуры по форме
Всем добрый вечер. Подскажите как сделать перемещение нарисованной фигуры по форме? Допустим...

Перемещение фигуры нарисованной DrawPolygon
Суть проблемы такая. Нужно по двойному клику нарисовать фигуру (в моем случае звезда красного цвета...

Как организовать плавное перемещение объекта по форме?
Здравствуйте! Хотел бы попросить у вас помощи с одним заданием. Как можно организовать плавное...

5
8347 / 4559 / 1784
Регистрация: 11.02.2013
Сообщений: 9,657
24.04.2015, 00:43 2
Вместо цикла используй таймер. Посмотри пример с бабочкой
1
4 / 4 / 0
Регистрация: 26.09.2012
Сообщений: 144
24.04.2015, 20:14  [ТС] 3
Что то я совсем ничего не понял =(
Вот у меня построение прямоугольника:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private void Regtangle_Create_Click(object sender, EventArgs e)
        {
            OurRectangle rectangle = new OurRectangle(Convert.ToInt32(Rectangle_X.Value),
                                        Convert.ToInt32(Rectangle_Y.Value),
                                        Convert.ToInt32(Rectangle_Widht.Value),
                                        Convert.ToInt32((Rectangle_Heigth.Value)));
            rectangle.Name = "Прямоугольник";
            rectangle.Pen = new Pen(Color.FromName(Rectangle_ColorsPen.SelectedItem.ToString()),
                                                Convert.ToInt32(Rectangle_WidhtTickness.Value));
            rectangle.Brush = new SolidBrush(Color.FromName(Rectangle_ColorsBrush.SelectedItem.ToString()));
            shapes.Add(rectangle);
            panelDrawing.Invalidate();
        }
А тут производится очистка формы:
C#
1
2
3
4
5
private void buttonClearDrawing_Click(object sender, EventArgs e)
        {
            shapes.Clear();
            panelDrawing.Invalidate();
        }
Как я уже говорил, я хочу плавно передвинуть созданный мной прямоугольник из координат x, y в координаты x2, y2. для этого проверками определяя его расположение и уже соответственно из этого передвижение на 1 пиксель, после чего форма очищается и снова передвижение на 1 пиксель
0
8347 / 4559 / 1784
Регистрация: 11.02.2013
Сообщений: 9,657
25.04.2015, 01:52 4
Лучший ответ Сообщение было отмечено richardok как решение

Решение

Перемещение реализуешь в самом классе по таймеру и вызываешь в форме событие для перерисовки.
Класс
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
using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace MoveRectangleExample {
    sealed class OurRectangle {
 
        public OurRectangle(Rectangle rectangle) {
            _rectangle = rectangle;
            _timer = new Timer() { Interval = 50 };
            _timer.Tick += _timer_Tick;
        }
 
        /// <summary>
        /// Событие, вызываемое при перемещении прямоугольника
        /// </summary>
        public event EventHandler Moved;
        private RectangleF _rectangle;
 
        private readonly Timer _timer;//Таймер для анимации движения
        private PointF _dir;//Направляющий вектор
        private float _speed = 13f;//Скорость движения
        private float _distance;//расстояние до конечной точки
        private PointF _lastLocation;//Исходная точка
 
        /// <summary>
        /// Перемещение прямоугольника в новое местоположение
        /// </summary>
        public void Move(Point newLocation) {
            _lastLocation = _rectangle.Location;//Исходное положение прямоугольника
            //Вектор между исходной и конечной точками
            _dir = new PointF(newLocation.X - _rectangle.X, newLocation.Y - _rectangle.Y);
            //Расстояние между исходной и конечной точками
            _distance = (float)Math.Sqrt(_dir.X * _dir.X + _dir.Y * _dir.Y);
            //Направляющий вектор из исходной точки в конечную
            _dir = new PointF(_dir.X / _distance, _dir.Y / _distance);
            _timer.Start();
        }
 
        void _timer_Tick(object sender, EventArgs e) {
            //Перемещаем прямоугольник в новое положение
            // по направляющему вектору с учётом скорости.
            _rectangle = new RectangleF(_rectangle.X + _speed * _dir.X, _rectangle.Y + _speed * _dir.Y, _rectangle.Width, _rectangle.Height);
            //Расстояние между исходной точкой и текущим положением
            double dist = Math.Sqrt(Math.Pow(_lastLocation.X - _rectangle.X, 2) + Math.Pow(_lastLocation.Y - _rectangle.Y, 2));
            //Если текущее расстояние стало больше исходного
            if (dist > _distance) {
                //Фиксация прямоугольника в конечной точке
                _rectangle = new RectangleF(_lastLocation.X + _dir.X * _distance, _lastLocation.Y + _dir.Y * _distance, _rectangle.Width, _rectangle.Height);
                //отключение таймера
                _timer.Stop();
            }
            //Вызов события
            OnMoved();
        }
 
        public void Draw(Graphics g) {
            g.DrawRectangle(Pens.Blue, _rectangle.X, _rectangle.Y, _rectangle.Width, _rectangle.Height);
        }
 
        private void OnMoved() {
            EventHandler handler = Moved;
            if (handler != null) handler(this, EventArgs.Empty);
        }
    }
}

Форма
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public partial class MainForm : Form {
 
    public MainForm() {
        InitializeComponent();
        DoubleBuffered = true;
        OurRectangle rect = new OurRectangle(new Rectangle(10, 10, 100, 64));
        //Обновление формы при перемещении
        rect.Moved += (s, e) => { Refresh(); };
        //Прорисовка прямоугольника при прорисовке формы
        Paint += (s, e) => { rect.Draw(e.Graphics); };
        //Запуск перемещения при клике
        MouseClick += (s, e) => { rect.Move(e.Location); };
    }
}
Вложения
Тип файла: zip MoveRectangleExample.zip (15.0 Кб, 98 просмотров)
1
4 / 4 / 0
Регистрация: 26.09.2012
Сообщений: 144
25.04.2015, 12:15  [ТС] 5
А как сделать тоже самое допустим с кругом. Вы используете структуру private RectangleF _rectangle. Для круга я подобную не нашел
0
8347 / 4559 / 1784
Регистрация: 11.02.2013
Сообщений: 9,657
25.04.2015, 12:59 6
Для круга, вернее окружности, точно так же, ведь она задается как окружность, вписанная в прямоугольник
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2015, 12:59

Плавное перемещение фигуры на canvas
Доброго времени суток, столкнулся с проблемой плавной отрисовки фигуры на канве. Использую...

Как сделать плавное перемещение MovieClip?
Есть две кнопки слева и справа, и по центру MovieClip. Как сделать плавное перемещение MovieClip ...

Как сделать плавное перемещение элемента?
Как сделать хотя-бы (если это просто) перемещение допустим кнопки на 100px вправо плавно? Спасибо...

Как сделать плавное перемещение картинки в обе стороны
DoubleAnimation da = new DoubleAnimation(0, 13, new Duration(TimeSpan.FromSeconds(1.8))); ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.