Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
7 / 5 / 4
Регистрация: 02.06.2012
Сообщений: 248

Рисование увеличивающихся окружностей с помощью двух таймеров

24.08.2014, 15:00. Показов 2234. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Код должен рисовать увеличивающиеся круги. Они увеличиваются и всё правильно.
Но ошибка происходит, когда я редактирую код, чтобы круги увеличивались с центра.
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
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;
 
namespace _123
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        Timer timer_game = new Timer();
        Timer timer_continue = new Timer();
        Random r1 = new Random();
        public Pen pen;
        int i = 0;
        int length = 100;
 
        private void button1_Click(object sender, EventArgs e)
        {
            pen = new Pen(Color.Black);
            pen.Alignment = System.Drawing.Drawing2D.PenAlignment.Inset;
            pen.Width = 1;
 
            rects = new Rectangle[length];
            g = this.CreateGraphics();
 
            timer_continue.Interval = 1;
            timer_continue.Enabled = true;
 
            timer_game.Interval = 1000;
            timer_game.Enabled = true;
            timer_game.Tick += Game_Start;
        }
 
        Rectangle[] rects;
 
        private void Game_Start(object sender, EventArgs e)
        {
            int i1 = r1.Next(0, this.Width);
            int i2 = r1.Next(0, this.Height);
            rects[i] = new Rectangle(i1, i2, 0, 0);
 
            if (i == 0)
                timer_continue.Tick += Game_Continue;
 
            i++;
        }
 
        Graphics g;
 
        private void Game_Continue(object sender, EventArgs e)
        {
            for (int i = 0; i < this.i; i++)
            {
                rects[i].Width++;
                rects[i].Height++;
 
                rects[i].X = rects[i].X - (rects[i].Width / 2);
                rects[i].Y = rects[i].Y - (rects[i].Height / 2);
 
                g.DrawEllipse(pen, rects[i]);
            }
        }
    }
}
Видео проблемы:

Кликните здесь для просмотра всего текста

Удачи с решением!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.08.2014, 15:00
Ответы с готовыми решениями:

Рекурсивное построение увеличивающихся окружностей
Добрый день, помогите разобраться. Надо написать приложение, которое строит ряд увеличивающихся окружностей. Число окружностей...

Рекурсия: построение ряда увеличивающихся окружностей
Напишите приложение, которое строит ряд увеличивающихся окружностей. Число окружностей удваивается на каждом шаге (в рекурсивном методе...

Приложение строящее ряд увеличивающихся окружностей по диагонали
Подскажите, что здесь надо изменить чтобы рекурсия выводилась так как на изображении using System; using System.Collections.Generic; ...

6
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
24.08.2014, 15:46
Должно быть так?
0
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
24.08.2014, 16:03
Если да, то вот код:
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
public partial class FormMain : Form
    {
        const int LENGTH = 100;
        Timer gameTimer = new Timer();
        Timer continueTimer = new Timer();
        Random generator = new Random();
        Pen pen;
        int numberOfRectangle;
 
        public FormMain()
        {
            InitializeComponent();
            this.MouseClick += new MouseEventHandler(Prepare);
        }
 
        private void Prepare(object sender, EventArgs e)
        {
            pen = new Pen(Color.Black);
            pen.Alignment = System.Drawing.Drawing2D.PenAlignment.Inset;
            pen.Width = 1;
 
            rects = new Rectangle[LENGTH];
            g = CreateGraphics();
 
            continueTimer.Interval = 500;
            continueTimer.Enabled = true;
            continueTimer.Tick += GameContinue;
 
            gameTimer.Interval = 1000;
            gameTimer.Enabled = true;
            gameTimer.Tick += GameStart;
        }
 
        Rectangle[] rects;
        private void GameStart(object sender, EventArgs e)
        {
            int x0 = generator.Next(Width);
            int y0 = generator.Next(Height);
            rects[numberOfRectangle++] = new Rectangle(x0, y0, 0, 0);           
        }
 
        Graphics g;
        int delta = 12;//Should be multiple of 2, imho
        private void GameContinue(object sender, EventArgs e)
        {
            for (int i = 0; i < numberOfRectangle; ++i)
            {
                rects[i].Width += delta;
                rects[i].Height += delta;
 
                rects[i].X -= delta / 2;
                rects[i].Y -= delta / 2;
 
                g.DrawEllipse(pen, rects[i]);
            }
        }
    }
Ошибка была в этом участке кода:
C#
1
2
3
4
5
                rects[i].Width += delta;
                rects[i].Height += delta;
 
                rects[i].X -= delta / 2;
                rects[i].Y -= delta / 2;
Координаты угла прямоугольника нужно было смещать на половину прироста его размера, а не на величину его текущего размера. Например, если размер увеличился на 4, то x, y нужно сместить влево и вверх соответственно
на 4/2 = 2
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
24.08.2014, 16:06
Рисуй в событии Paint. Для рисования от центра смещай Graphics методом TranslateTransform. Задавать 1мс для таймера нет смысла. Как минимум 50мс
0
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
24.08.2014, 16:36
Цитата Сообщение от ViterAlex Посмотреть сообщение
Рисуй в событии Paint
А как тогда правильно спровоцировать Paint?

Добавлено через 5 минут
Если юзать Invalidate() or Refresh, то рисоваться будут только внешние круги. А внудренние будут затираться. Т.к. объект Graphics постоянно обновляется.
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
24.08.2014, 18:36
Использовать bufferedGraphics или Bitmap
0
7 / 5 / 4
Регистрация: 02.06.2012
Сообщений: 248
25.08.2014, 18:57  [ТС]
Всё окей, сам решил.
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
        public Form1()
        {
            InitializeComponent();
        }
 
        Timer timer_game = new Timer();
        Timer timer_continue = new Timer();
        Random r1 = new Random();
        public Pen pen;
        int i = 0;
        int length = 100;
 
        private void button1_Click(object sender, EventArgs e)
        {
            pen = new Pen(Color.Black);
            pen.Alignment = System.Drawing.Drawing2D.PenAlignment.Inset;
            pen.Width = 1;
 
            rects = new Rectangle[length];
            g = this.CreateGraphics();
            points = new Point[length];
 
            timer_continue.Interval = 1;
            timer_continue.Enabled = true;
 
            timer_game.Interval = 1000;
            timer_game.Enabled = true;
            timer_game.Tick += Game_Start;
        }
 
        Rectangle[] rects;
        Point[] points; //edited
 
        private void Game_Start(object sender, EventArgs e)
        {
            int i1 = r1.Next(0, this.Width);
            int i2 = r1.Next(0, this.Height);
            rects[i] = new Rectangle(i1, i2, 0, 0);
            points[i] = new Point(i1, i2); //edited
 
            if (i == 0)
                timer_continue.Tick += Game_Continue;
 
            i++;
        }
 
        Graphics g;
 
        private void Game_Continue(object sender, EventArgs e)
        {
            for (int i = 0; i < this.i; i++)
            {
                rects[i].Width++;
                rects[i].Height++;
 
                rects[i].X = points[i].X - (rects[i].Width / 2); //edited
                rects[i].Y = points[i].Y - (rects[i].Height / 2); //edited
 
                g.DrawEllipse(pen, rects[i]);
            }
        }
Проблема была в следующих строках:
C#
1
2
                rects[i].X = rects[i].X - (rects[i].Width / 2);
                rects[i].Y = rects[i].Y - (rects[i].Height / 2);
Но я исправил, глупая ошибка, спасибо всем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.08.2014, 18:57
Помогаю со студенческими работами здесь

Рисование спиралей и окружностей (некорректная отрисовка окружностей)
Здравствуйте! Возникла проблема, разобраться в которой не получается Задача:нарисовать две спирали (по часовой и против) цвет ...

Сделать контейнер окружностей и релизовать через динамический массив окружностей с помощью SetLength
нам сказали сделать контейнер окружностей и релизовать через динамический массив окружностей с помощью SetLength но толком не объяснили...

Найти геометрическое место центров окружностей, касающихся двух данных окружностей
Найти геометрическое место центров окружностей, касающихся двух данных окружностей (x+1)^2-y^2=4 (x-1)^2-y^2=36 В ответе должно...

Найти геометрическое место центров окружностей, касающихся двух данных окружностей
Найти геометрическое место точек, из которых эллипс 4x^2+5y^2=20 виден под прямым углом.

Вычислить длины двух окружностей и площадь кольца, образованного из этих окружностей
Очень нужна ваша помощь. Вычислите длины двух окружностей с радиусами R и r, а также площадь кольца, образованного из этих окружностей с...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
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