Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 19
1

Рисование на форме и перемещение по таймеру

25.10.2016, 19:34. Показов 2614. Ответов 11
Метки нет (Все метки)

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

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

Вот, что удалось пока написать

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
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 WindowsFormsApplication2
{
 
    public partial class Form1 : Form
    {
        private Graphics gp;
        private Pen p;
        private float x,y,dx=2,dy=3,x1,y1,rmax,rmin, dx1=2, dy1=3;//dx и dy это смещение, rmax/min это максимальное и минимальное расстояние до точки 
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        public Form1()
         {
            InitializeComponent();
            gp = pictureBox1.CreateGraphics();
            this.DoubleBuffered = true;
         }
 
 
        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            timer1.Interval = Convert.ToInt32(textBox1.Text);
            rmax = Convert.ToInt32(textBox2.Text);
            rmin = Convert.ToInt32(textBox3.Text);
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        { 
            double a = Math.Pow((Math.Pow((x - x1), 2)), 0.5), b= Math.Pow(Math.Pow((y - y1),2),0.5);//a и b я считаю по формуле расстояния, а потом сравниваю. 
            var t = new Timer();
            t.Tick += TimerEventProcessor;
 
            if (x > this.pictureBox1.Width-15 || x < 0) dx = -dx;
            if (y > this.pictureBox1.Height-15 || y<0) dy = -dy;
            if (a > rmax || a< rmin || x1<0 || x1> this.pictureBox1.Width - 15) dx1 = -dx1;
            if (b > rmax || b< rmin|| y1<0 || y1> this.pictureBox1.Height - 15) dy1 = -dy1;
            x += dx; y += dy;
            x1 += dx1;y1 += dy1;
            t.Start();
            
            pictureBox1.Invalidate();
        }
        private void TimerEventProcessor(object sender, EventArgs e)
        {
            Pen p = new Pen(Color.Black, 1);
            gp.DrawEllipse(p, x, y, 10, 10);
            gp.DrawEllipse(p, x1, y1, 5, 5);
            label1.Text = Math.Pow((Math.Pow((x1 - x), 2) + Math.Pow((y1 - y), 2)), 0.5).ToString();//чисто для себя выводил расстояние между шариками 
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2016, 19:34
Ответы с готовыми решениями:

Рисование прямой линии по таймеру
Требуется нарисовать по сути вот такую штуку http://savepic.org/3468491.gif . только почаще линии...

Мерцание при перемещение картинки в PictureBox по таймеру
Добрый день. У меня проблема мерцания при перемещение картинки в PictureBox по таймеру. Пробовал...

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

Перемещение объекта по форме по таймеру
Как сделать визуализацию? Чтобы допустим перемещался какой-то элемент на форме по времени.

11
911 / 815 / 333
Регистрация: 03.02.2015
Сообщений: 5,265
Записей в блоге: 9
27.10.2016, 00:20 2
Лучший ответ Сообщение было отмечено Sandman01 как решение

Решение

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
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 LeadingPoint
{
    public partial class MainForm : Form
    {
        public enum Dereect { f, l, r, b }
 
        private const int _SizeSide = 10;
        private const int _CountPoints = 5;
        private const int _Bitwen = _SizeSide;
 
        private Dereect _Dereect = Dereect.f;
        private Size _PointSize = new Size(_SizeSide, _SizeSide);
        private List<Point> _Points = new List<Point>(_CountPoints);
        private SolidBrush _BrashDraw = new SolidBrush(Color.Red);
 
        public MainForm()
        {
            InitializeComponent();
 
            for (int i = 0; i < _CountPoints; i++)
            {
                _Points.Add(new Point());
            }
        }
 
        private void MovePoints(int step)
        {
            var stepX = step;
            var stepY = step;
            var bitwenX = _Bitwen;
            var bitwenY = _Bitwen;
 
            if (_Dereect == Dereect.f) { stepY *= -1; stepX = 0; bitwenX = 0; }
            else if (_Dereect == Dereect.r) { stepY = 0; bitwenX *= -1; bitwenY = 0; }
            else if (_Dereect == Dereect.l) { stepY = 0; stepX *= -1; bitwenY = 0; }
            else if (_Dereect == Dereect.b) { stepX = 0; bitwenX = 0; bitwenY *= -1; }
 
            _Points[0] = new Point(_Points[0].X + stepX, _Points[0].Y + stepY);
 
            for (int i = 1; i < _CountPoints; i++)
            {
                _Points[i] = new Point(_Points[i - 1].X + bitwenX, _Points[i - 1].Y + bitwenY);
            }
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            for (int i = 0; i < _CountPoints; i++)
            {
                _BrashDraw.Color = i == 0 ? Color.Red : Color.Blue;
 
                Rectangle rec = new Rectangle(_Points[i], _PointSize);
                e.Graphics.FillEllipse(_BrashDraw, rec);
            }
        }
 
        private void timerPuls_Tick(object sender, EventArgs e)
        {
            MovePoints(2);
            Invalidate();
        }
 
        private void MainForm_MouseDown(object sender, MouseEventArgs e)
        {
            _Points[0] = new Point(e.X, e.Y);
        }
 
        private void buttonF_Click(object sender, EventArgs e)
        {
            _Dereect = Dereect.f;
        }
 
        private void buttonR_Click(object sender, EventArgs e)
        {
            _Dereect = Dereect.r;
 
        }
 
        private void buttonB_Click(object sender, EventArgs e)
        {
            _Dereect = Dereect.b;
        }
 
        private void buttonL_Click(object sender, EventArgs e)
        {
            _Dereect = Dereect.l;
        }
    }
}
Думаю принцип понятен.
Миниатюры
Рисование на форме и перемещение по таймеру  
1
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 19
27.10.2016, 00:28  [ТС] 3
Цитата Сообщение от Sanya_sa Посмотреть сообщение
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
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 LeadingPoint
{
    public partial class MainForm : Form
    {
        public enum Dereect { f, l, r, b }
 
        private const int _SizeSide = 10;
        private const int _CountPoints = 5;
        private const int _Bitwen = _SizeSide;
 
        private Dereect _Dereect = Dereect.f;
        private Size _PointSize = new Size(_SizeSide, _SizeSide);
        private List<Point> _Points = new List<Point>(_CountPoints);
        private SolidBrush _BrashDraw = new SolidBrush(Color.Red);
 
        public MainForm()
        {
            InitializeComponent();
 
            for (int i = 0; i < _CountPoints; i++)
            {
                _Points.Add(new Point());
            }
        }
 
        private void MovePoints(int step)
        {
            var stepX = step;
            var stepY = step;
            var bitwenX = _Bitwen;
            var bitwenY = _Bitwen;
 
            if (_Dereect == Dereect.f) { stepY *= -1; stepX = 0; bitwenX = 0; }
            else if (_Dereect == Dereect.r) { stepY = 0; bitwenX *= -1; bitwenY = 0; }
            else if (_Dereect == Dereect.l) { stepY = 0; stepX *= -1; bitwenY = 0; }
            else if (_Dereect == Dereect.b) { stepX = 0; bitwenX = 0; bitwenY *= -1; }
 
            _Points[0] = new Point(_Points[0].X + stepX, _Points[0].Y + stepY);
 
            for (int i = 1; i < _CountPoints; i++)
            {
                _Points[i] = new Point(_Points[i - 1].X + bitwenX, _Points[i - 1].Y + bitwenY);
            }
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            for (int i = 0; i < _CountPoints; i++)
            {
                _BrashDraw.Color = i == 0 ? Color.Red : Color.Blue;
 
                Rectangle rec = new Rectangle(_Points[i], _PointSize);
                e.Graphics.FillEllipse(_BrashDraw, rec);
            }
        }
 
        private void timerPuls_Tick(object sender, EventArgs e)
        {
            MovePoints(2);
            Invalidate();
        }
 
        private void MainForm_MouseDown(object sender, MouseEventArgs e)
        {
            _Points[0] = new Point(e.X, e.Y);
        }
 
        private void buttonF_Click(object sender, EventArgs e)
        {
            _Dereect = Dereect.f;
        }
 
        private void buttonR_Click(object sender, EventArgs e)
        {
            _Dereect = Dereect.r;
 
        }
 
        private void buttonB_Click(object sender, EventArgs e)
        {
            _Dereect = Dereect.b;
        }
 
        private void buttonL_Click(object sender, EventArgs e)
        {
            _Dereect = Dereect.l;
        }
    }
}
Думаю принцип понятен.
Отлично, благодарю, буду разбираться!
У меня есть вопрос, может ответишь
Методы отрисовки, вот я где-то видел краткий гайд, там было как у меня в коде, у тебя e.Graphics , в чем разница ?
0
911 / 815 / 333
Регистрация: 03.02.2015
Сообщений: 5,265
Записей в блоге: 9
27.10.2016, 01:13 4
https://msdn.microsoft.com/ru-... .110).aspx
https://msdn.microsoft.com/ru-... .110).aspx
https://www.cyberforum.ru/blogs/529033/
0
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 19
27.10.2016, 13:56  [ТС] 5
А можешь прокомментировать программу ?
И еще, можешь в архиве кинуть прогу ? Попробовал переписать, чтобы посмотреть принцип работы, не запускается корректно
0
911 / 815 / 333
Регистрация: 03.02.2015
Сообщений: 5,265
Записей в блоге: 9
27.10.2016, 13:57 6
Попробовал переписать, чтобы посмотреть принцип работы, не запускается корректно
Что пишет?
0
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 19
27.10.2016, 14:01  [ТС] 7
Цитата Сообщение от Sanya_sa Посмотреть сообщение
Попробовал переписать, чтобы посмотреть принцип работы, не запускается корректно
Что пишет?
Точки в углу формы и нет никакого перемещения по кнопкам.
Они же у тебя отрисовываются именно на самой форме ?

По сути, я просто содрал твой код в новый проект
0
911 / 815 / 333
Регистрация: 03.02.2015
Сообщений: 5,265
Записей в блоге: 9
27.10.2016, 14:04 8
Точки в углу формы и нет никакого перемещения по кнопкам. - таймер включите и будет Вам счастье
Они же у тебя отрисовываются именно на самой форме ? - да.
0
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 19
27.10.2016, 15:48  [ТС] 9
Та в том и дело, что сразу активировал
0
911 / 815 / 333
Регистрация: 03.02.2015
Сообщений: 5,265
Записей в блоге: 9
27.10.2016, 15:54 10
Цитата Сообщение от Sandman01 Посмотреть сообщение
Та в том и дело, что сразу активировал
те становились на брейкпоинт в обработчике?
0
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 19
27.10.2016, 18:08  [ТС] 11
Да, наверное, если я правильно вопрос понял
0
911 / 815 / 333
Регистрация: 03.02.2015
Сообщений: 5,265
Записей в блоге: 9
27.10.2016, 22:07 12
Sandman01,
Вложения
Тип файла: rar LeadingPoint.rar (51.1 Кб, 9 просмотров)
0
27.10.2016, 22:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2016, 22:07
Помогаю со студенческими работами здесь

Перемещение объекта и его рисование на форме
Доброго времени суток, форумчане. Как можно реализовать перемещение объектов Obj в моей программе ?...

Перемещение по таймеру
Помогите связать таймер и форму!!!!

Рисование изображения по таймеру
Всем доброго времени суток, уважаемые форумчане. Имеется процедура обработки изображения в таймере...

Перемещение символа по таймеру
Добрый вечер, необходимо реализовать перемещение символа по таймеру. Помогите исправить ошибку,...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru