Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
 Аватар для FactorX
0 / 0 / 0
Регистрация: 06.05.2013
Сообщений: 23

Графика в C#

25.05.2013, 16:18. Показов 3006. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
По двум осям непрерывно движутся два объекта. Достигая границ окна, они возвращаются на исходную, и так постоянно. Нужно реализовать алгоритм, который не будет давать объектам пересекаться при прохождении смежной точки осей. Много думал, ничего дельного не получается. Порекомендуйте, как можно лучше сделать это.
Единственное, до чего я пока додумался, это использовать таймеры. По тику таймера объект перемещается по оси до ее конечной точки. Затем этот таймер останавливается и запускается второй, который возвращает его на исходную. И так для двух объектов.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.05.2013, 16:18
Ответы с готовыми решениями:

Рисование графика: обработка новых входящих данных и движение графика на форме
Подскажите каким способом можно вывести график частью главного окна программы, при чем график получает данные *в живую* с устройства по...

Построение графика графика квадратичной функции
Как построить график квадратичной функции? Построил только простую параболу, как ее сдвигать? int ixPrev = -1, iyPrev =...

Chart - диаграмма: изменить точность делений графика, установить центр графика в (0,0)
Создал диаграмму (все прекрасно считается точки расставляются), но есть проблемыЖ 1. В случае диаграммы - "Спектр амплитуд",...

5
 Аватар для Alex_Sabaka
638 / 499 / 77
Регистрация: 28.07.2010
Сообщений: 895
25.05.2013, 17:09
Не совсем понял суть задания, но вот маленький примерчик:
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
    public partial class Form1 : Form
    {
        class Circle
        {
            public float Radius { get; set; }
            public PointF Center { get; set; }
            public PointF Velocity { get; set; }
            public RectangleF Bounds
            {
                get
                {
                    return new RectangleF(this.Center.X - this.Radius, this.Center.Y - this.Radius, 2f * this.Radius, 2f * this.Radius);
                }
            }
 
            public Circle(float r, PointF c, PointF v)
            {
                this.Radius = r;
                this.Center = c;
                this.Velocity = v;
            }
 
            public void Update(float dt)
            {
                PointF nc = new PointF();
                nc.X = this.Center.X + this.Velocity.X * dt;
                nc.Y = this.Center.Y + this.Velocity.Y * dt;
                this.Center = nc;
            }
 
            public void Draw(Graphics gr, Color color)
            {
                gr.FillEllipse(new SolidBrush(color), this.Bounds);
            }
        }
 
        Circle a, b;
 
        public Form1()
        {
            InitializeComponent();
            a = new Circle(10f, new PointF(320, 10), new PointF(0, 4 * 4.8f));
            b = new Circle(10f, new PointF(10, 240), new PointF(4 * 6.4f, 0));
            this.ClientSize = new Size(640, 480);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
            Application.Idle += Idle;
        }
 
        private void Idle(object sender, EventArgs e)
        {
            int tc1 = Environment.TickCount;
            this.Invalidate();
            FPS();
            Text = "FPS: " + fps.ToString();
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            this.Update();
            base.OnPaint(e);
            e.Graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            this.Draw(e.Graphics);
        }
 
        int ptc1 = Environment.TickCount;
        protected new void Update()
        {
            int tc1 = Environment.TickCount;
            float dt = (tc1 - ptc1) / (1000f / timeScale);
            if (distance(a.Center, b.Center) > 2.2f * (a.Radius + b.Radius)) a.Update(dt);
            b.Update(dt);
            if (b.Bounds.Left <= 0f || b.Bounds.Right >= this.ClientSize.Width) b.Velocity = new PointF(b.Velocity.X * -1f, 0f);
            if (a.Bounds.Top <= 0f || a.Bounds.Bottom >= this.ClientSize.Height) a.Velocity = new PointF(0f, a.Velocity.Y * -1f);
            ptc1 = tc1;
            base.Update();
        }
 
        float distance(PointF p1, PointF p2)
        {
            return (float)Math.Sqrt((p1.X - p2.X) * (p1.X - p2.X) + (p1.Y - p2.Y) * (p1.Y - p2.Y));
        }
 
        private void Draw(Graphics gr)
        {
            gr.Clear(this.BackColor);
            a.Draw(gr, this.ForeColor);
            b.Draw(gr, this.ForeColor);
        }
 
        int fps = 0, cf = 0;
        int ptc = Environment.TickCount;
        void FPS()
        {
            int tc = Environment.TickCount;
            if (tc - ptc >= 1000)
            {
                fps = cf;
                ptc = tc;
                cf = 0;
            }
            else cf++;
        }
 
        float timeScale = 1f;
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            timeScale = trackBar1.Value / 10f;
            label1.Text = string.Format("Time scale({0:F1}x)", timeScale);
        }
    }
Добавьте на форму один Label и TrackBar.
1
 Аватар для FactorX
0 / 0 / 0
Регистрация: 06.05.2013
Сообщений: 23
25.05.2013, 18:14  [ТС]
Сложноватый примерчик для моего уровня ))) Каким образом решается моя задача в вашем примере?

Добавлено через 2 минуты
Вот пока что то, что я успел намозговать. Работает малость некорректно.

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
 
namespace Lab7_OOP_Lee
{
    public partial class Form1 : Form
    {
        int posX = 0, posY = 0;
        public Form1()
        {            
            InitializeComponent();
            //Thread Stream1 = new Thread(timer1_Tick);
        }
 
        public void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.DrawLine(Pens.Gold,0,200,400,200);
            g.DrawLine(Pens.Gold, 200, 0, 200, 400);
            g.DrawEllipse(Pens.Red, posX, 175, 50, 50);
            g.DrawRectangle(Pens.DarkGreen, 160, posY, 75, 50);
        }
 
        public void timer1_Tick(object sender, EventArgs e)
        {
            if (posY == 3)
            {
                timer1.Stop();
                timer2.Enabled = true;
            }
            /*if (posY >= 100 && posY <= 300 && posX >= 100 && posX <= 300)
            {
                posY++;
                Invalidate();
            }
            else
            {*/
                //posX++;
                posY++;
                Invalidate();
            
        }
 
        public void timer2_Tick(object sender, EventArgs e)
        {
            if (posY == 0)
            {
                timer2.Stop();
                timer1.Enabled = true;
            }
            //posX--;
            posY--;
            Invalidate();
        }
    }
}
0
212 / 214 / 44
Регистрация: 20.12.2011
Сообщений: 635
25.05.2013, 18:36
Цитата Сообщение от FactorX Посмотреть сообщение
Единственное, до чего я пока додумался, это использовать таймеры. По тику таймера объект перемещается по оси до ее конечной точки. Затем этот таймер останавливается и запускается второй, который возвращает его на исходную. И так для двух объектов.
скажу сразу, исходники не смотрел
не нужен Вам второй таймер. попробую объяснить, надеюсь поймёте:
у Вас есть 2 оси, допустим Вы смещаете по тику таймера каждый объект на 10 пикселей.
алгоритм тогда получается следующий:
1. сместили на 10 пикселей
2. проверили, а не вышел ли объект за границу
3. если вышел, вернули на исходную
4. после проверки на выход за границу, проверяете, а не пересеклись ли объекты
5. если пересеклись, то либо сместили обратно на 10 пикселей(один объект пропускает второй), либо обработали как Вам нужно
0
 Аватар для Alex_Sabaka
638 / 499 / 77
Регистрация: 28.07.2010
Сообщений: 895
25.05.2013, 20:29
Цитата Сообщение от FactorX Посмотреть сообщение
Каким образом решается моя задача в вашем примере?
Все Ваше задание решается в строчках 74-77, а все остальное вспомогательные действия.
Класс Circle - это объекты которые будем двигать. У него есть позиция центра, радиус и скорость.
C#
1
2
3
4
            if (distance(a.Center, b.Center) > 2.2f * (a.Radius + b.Radius)) a.Update(dt);
            b.Update(dt);
            if (b.Bounds.Left <= 0f || b.Bounds.Right >= this.ClientSize.Width) b.Velocity = new PointF(b.Velocity.X * -1f, 0f);
            if (a.Bounds.Top <= 0f || a.Bounds.Bottom >= this.ClientSize.Height) a.Velocity = new PointF(0f, a.Velocity.Y * -1f);
Поясняю построчно:
1 - если расстояние между шариками меньше чем 2.2 * (R1 + R2), то мы НЕ двигаем первый шарик, а только второй, т.е. первый шарик "уступает" дорогу второму. Константа 2.2 была выбрана от фонаря.
2 - обновляем позицию второго шарика.
3 - если 2ой шарик вышел за вертикальные границы формы, то мы его отражаем от стенок, т.е. меняем скорость на противоположную.
4 - тоже что и 3, только для 1ого шарика и горизонтальных границ формы.
0
 Аватар для FactorX
0 / 0 / 0
Регистрация: 06.05.2013
Сообщений: 23
25.05.2013, 21:03  [ТС]
Fler, я знаю, как это выглядит. Объяснить-то это несложно ) Я застрял на последнем этапе - проверка на пересечения.

В моем коде координаты меняются в одном таймере для обоих объектов. Если один из них пропускает второй, то один проходит (по моему коду) избыточное расстояние и остается где-то за пределами и там совершает возвратные движения. Вот с этим у меня загвоздка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.05.2013, 21:03
Помогаю со студенческими работами здесь

Автоматическое изменение графика при переносе данных, формулы и графика на другой лист
На первом листе, на основании каких-либо вычислений строим график, а затем полностью копируем первой лист на второй, а затем изменяем...

Совмещение поточечного графика и графика построенного функцией на отрезке
Есть некий массив array1 = {...} и func = y /. NDslove По отдельности строю так: Plot и ListLogPlot Как их совместить? ...

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

Шкала графика Chart Control - Сделать так, чтобы значения графика были с 2 знаками после запятой
Здравствуйте! У меня такая проблема: В базе данных есть числовые данные, на основе которых рисуется график Подскажите, пожалуйста,...

Графика: построить 2 графика в одной координатной плоскости
Нужно построить 2 графика в одной координатной плоскости, но для начала нужно протабулировать функции... С Графикой ни разу не встречалась,...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
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. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru