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

ScreenSaver как изменить цвет и размер эллипса во время его движения?

22.01.2019, 19:44. Показов 2715. Ответов 7

Студворк — интернет-сервис помощи студентам
Здравствуйте, я новичок в c#, решил написать ScreenSaver. Не могу понять как изменить цвет эллипса на рандомный во время его ударов о край формы, а также как написать, его плавное изменение в размерах(чтобы он расширялся и сужался)?

форма
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
public partial class FormScreenSaver : Form
    {
        
        Graph graph;
        Pixel p, s, d, max, min;
     
 
        public FormScreenSaver()
        {
            InitializeComponent();
            graph = new Graph(picture.Width, picture.Height, Color.White, Color.Blue);
            InitFigure();
            timer.Enabled = true;
        }
        private void InitFigure()
        {
            p = new Pixel(100, 1000);
            s = new Pixel(10, 13);
            d = new Pixel(50, 50);
            max = new Pixel(graph.bmp.Width - d.x - 3, graph.bmp.Height - d.y - 3);
            min = new Pixel(0, 0);
        }
        private void timer_Tick(object sender, EventArgs e)
        {
            graph.EraseCircle(p, d);
            p.x += s.x;
            p.y += s.y;
            if(p.x < min.x)
            {
                s.x = -s.x;
                p.x = min.x - (p.x - min.x);
            }
            if(p.x > max.x)
            {
                s.x = -s.x;
                p.x = max.x - (p.x - max.x);
            }
            if(p.y < min.y)
            {
                s.y = -s.y;
                p.y = min.y - (p.y - min.y);
            }
            if(p.y > max.y)
            {
                s.y = -s.y;
                p.y = max.y - (p.y - max.y);
            }
            graph.DrawCircle(p, d);
            picture.Image = graph.bmp;
        }
    }
}
класс graph
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
public class Graph
    {
        public Bitmap bmp { get; private set; }
        Graphics graph;
 
        Pen penFore;
        Pen penBack;
 
        Color colorFore = Color.Blue;
        Color colorBack = Color.White;
 
 
        public Graph(int width, int height)
        {
            bmp = new Bitmap(width, height);
            graph = Graphics.FromImage(bmp);
            InitPens();
        }
        private void InitPens()
        {
            penFore = new Pen(colorFore, 2.0f);
            penBack = new Pen(colorBack, 2.0f);
            graph.Clear(colorBack);
        }
 
        public Graph(int width, int height, Color back, Color fore)
            : this(width, height)
        {
            colorBack = back;
            colorFore = fore;
            InitPens();
        }
 
 
        public void DrawCircle(Pixel pixel, Pixel depth)
        {
            graph.DrawEllipse(penFore, pixel.x, pixel.y, depth.x, depth.y);
        }
        public void EraseCircle(Pixel pixel, Pixel depth)
        {
            graph.DrawEllipse(penBack, pixel.x, pixel.y, depth.x, depth.y);
        }
        
    }
}
класс pixel
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace ScreenSaver
{
    public struct Pixel
    {
        public int x;
        public int y;
 
        public Pixel(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.01.2019, 19:44
Ответы с готовыми решениями:

Как изменить цвет Border и его размер
Подскажите, как изменить цвет синей строки вверху окна и ее размер.

Изменить цвет эллипса при его попадании в квадрат
Очень нужна помощь реализовал движение эллипса но никак не выходит реализовать изменение цвета эллипса при попадании в другую...

Как изменить цвет пункта ListView при нажатии на него и сохранять его цвет при проматывании списка?
Здравствуйте, подскажите, пожалуйста, как изменить цвет пункта ListView при нажатии на него и сохранять его цвет при проматывании списка? ...

7
384 / 184 / 107
Регистрация: 07.01.2016
Сообщений: 496
22.01.2019, 20:32
NinJaSan, надо бы класс для эллипса лепить, в нем должны быть все параметры эллипса: позиция, скорость по X и Y, координаты "стенки" - предельные координаты, 2 полуоси, предельные значения полуосей, скорость изменения полуосей за тик, цвет заливки, цвет пера, толщина пера... И определять метод его отрисовки.
0
0 / 0 / 0
Регистрация: 22.01.2019
Сообщений: 22
22.01.2019, 20:57  [ТС]
Цитата Сообщение от alexus5 Посмотреть сообщение
NinJaSan
alexus5,а если без класса?
0
384 / 184 / 107
Регистрация: 07.01.2016
Сообщений: 496
22.01.2019, 21:03
Лучший ответ Сообщение было отмечено NinJaSan как решение

Решение

NinJaSan, рекомендую брать за привычку сложные объекты паковать в классы
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
    public class Ellipse
    {
        static Random rand = new Random();
        public float X { get; set; }
        public float Y { get; set; }
        public float XMin { get; set; }
        public float XMax { get; set; }
        public float YMin { get; set; }
        public float YMax { get; set; }
        public float VX { get; set; }
        public float VY { get; set; }
        /// <summary>
        /// Вертикальная полуось
        /// </summary>
        public float RH { get; set; }
        /// <summary>
        /// Горизонтальная полуось
        /// </summary>
        public float RW { get; set; }
        public float RHMin { get; set; }
        public float RHMax { get; set; }
        public float RWMin { get; set; }
        public float RWMax { get; set; }
 
        /// <summary>
        /// Скорость изменения радиуса
        /// </summary>
        public float RHdelta { get; set; }
        public float RWdelta { get; set; }
 
        public SolidBrush Brush { get; set; }
        public Pen Pen { get; set; }
        public float PenWidth { get; set; } = 2F;
        public Ellipse(float x, float y, Rectangle limit, SizeF min, SizeF max, double V, double angle, PointF delta, Color pen, Color brush)
        {
            X = x;
            Y = y;
            XMin = limit.Left;
            XMax = limit.Right;
            YMin = limit.Top;
            YMax = limit.Bottom;
            VX = (float)(V * Math.Cos(angle));
            VY = (float)(V * Math.Sin(angle));
            RWMin = min.Width;
            RWMax = max.Width;
            RHMin = min.Height;
            RHMax = max.Height;
            RW = (RWMax + RWMin) / 2;
            RH = (RHMax + RHMin) / 2;
            RHdelta = delta.Y;
            RWdelta = delta.X;
            SetColor(pen, brush);
        }
        public void SetColor(Color pen, Color brush)
        {
            Pen = new Pen(pen, PenWidth);
            Brush = new SolidBrush(brush);
        }
        public void NextFrame()
        {
            X += VX;
            Y += VY;
            RW += RWdelta;
            RH += RHdelta;
            // проверка на столкновение со стенкой
            // вертикальные
            if(X - RW < XMin || X + RW > XMax)
            {
                VX *= -1;
                X += VX;
                SetColor(rand.GetColor(255), rand.GetColor(128));
            }
            // горизонтальные
            if (Y - RH < YMin || Y+RH > YMax)
            {
                VY *= -1;
                Y += VY;
                SetColor(rand.GetColor(255), rand.GetColor(64));
            }
            // проверка на достижение предельных значений радиусов
            if (RW<RWMin || RW>RWMax)
            {
                RWdelta *= -1;
                RW += RWdelta;
            }
            if (RH<RHMin || RH>RHMax)
            {
                RHdelta *= -1;
                RH += RHdelta;
            }
        }
 
    }
Миниатюры
ScreenSaver как изменить цвет и размер эллипса во время его движения?  
Вложения
Тип файла: 7z Test.7z (102.7 Кб, 9 просмотров)
0
0 / 0 / 0
Регистрация: 22.01.2019
Сообщений: 22
22.01.2019, 21:21  [ТС]
alexus5, Ого, спасибо большое, да задумка именно такая, я постараюсь на вашем примере доработать свой, еще раз спасибо
0
0 / 0 / 0
Регистрация: 22.01.2019
Сообщений: 22
23.01.2019, 17:17  [ТС]
alexus5, сижу и разбираю ваш код, не могу понять что реализуют остальные классы, т.к. в своей работе я делал через компонент PictureBox, а здесь идет задание сетки, поясните, пожалуйста, если не сложно
0
384 / 184 / 107
Регистрация: 07.01.2016
Сообщений: 496
23.01.2019, 17:25
NinJaSan, да, там что-то много чего лишнего, вот здесь все, что не нужно, удалил.
Вложения
Тип файла: 7z Test1.7z (140.1 Кб, 6 просмотров)
0
0 / 0 / 0
Регистрация: 22.01.2019
Сообщений: 22
23.01.2019, 19:36  [ТС]
alexus5, ага, вот теперь все понял) спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.01.2019, 19:36
Помогаю со студенческими работами здесь

Как изменить шрифт и его цвет в Label
Народ каким образом мне сделать прорисовку или что то другое, похожее на private Pen ramkaPen = new Pen(Color.Maroon, 5); // прорисовка...

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

Как изменить размер фонта у виджета и всех его детишек?
QDialog *mw = new QDialog(); mw-&gt;font().setPixelSize(16); Дает error: passing `const QFont' as `this' argument of `void...

Как изменить размер квадрата потянув за его ребро мышкой
Всем добрый день. Пишу для своего движка небольшой 3д редактор уровней (базовый функционал) на подобии Valve Hammer. Так вот, в чем...

Как изменить цвет и размер шрифта input type="radio"
&lt;input type=&quot;radio&quot; id=&quot;drink1&quot; value=&quot;rad1&quot; checked=&quot;checked&quot;&gt; OPTION 1 ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru