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

Графика: Нарисовать круги рандомного радиуса в панели

22.03.2013, 21:28. Показов 6638. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите разобраться с программой по графике в c sharp forms
программа выводит круги рандомного радиуса в панели
Можете обьснить что делает данная комманда(что это вместо if я знаю) : int r = (y - pnt.Y > x - pnt.X) ? rnd.Next(x - pnt.X) : rnd.Next(y - pnt.Y);
Ещё знаю что она делает чтоб круги не вылазили за пределы панели, а вот именно сам принцип я не понимаю
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
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 aw
{
    public partial class Form1 : Form
    {
        Graphics graph;
        Random rnd = new Random();
        SolidBrush br = new SolidBrush(Color.FromArgb(0,0,0));
        public Form1()
        {
            InitializeComponent();
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            if (timer1.Enabled)
            {
                graph = panel1.CreateGraphics();
                DrawCircle();
            }
 
        }
        void DrawCircle()
        {
            int x = panel1.Width;  //ширина панели
            int y = panel1.Height; //высота панели
            br.Color=Color.FromArgb(rnd.Next(255), rnd.Next(255), rnd.Next(255));  //рандомный цвет
            Point pnt = new Point(rnd.Next(x), rnd.Next(y));     //размещение 
            int r = (y - pnt.Y > x - pnt.X) ? rnd.Next(x - pnt.X) : rnd.Next(y - pnt.Y); // понял что тут подбирается размер, принцип не совсем понимаю
            Size sz = new Size(r, r);        
            Rectangle rct = new Rectangle(pnt, sz);
            graph.FillEllipse(br, rct);
 
        }
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Enabled = false;
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (timer1.Enabled)
            {
                this.Invalidate(false);
                timer1.Interval = 10;
            }
        }
 
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
 
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.03.2013, 21:28
Ответы с готовыми решениями:

Графика, круги случайного радиуса и центра разного цвета
Формулировка задачи: Разработать приложение, рисующее на экране круги со случайным расположением центра, случайным размером радиуса (но...

Графика в паскале. Нарисовать круги разного цвета
Построить 7 кругов разного цвета радиусом 30 пикселей. координаты центров: Х 112 140 189 54 388 421 539 У 39 308 233 163 137 ...

Нарисовать круги
Добрый вечер, господа, начинаю изучать C# и нужна ваша помощь Мне надо нарисовать эти круги, но чтобы я вводил кол-во этих кругов и...

19
60 / 60 / 17
Регистрация: 09.06.2009
Сообщений: 117
22.03.2013, 21:36
Почитайте про "Тернарную условную операцию" . Можно тут.
0
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 46
22.03.2013, 21:57  [ТС]
нет, синтаксис я понимаю, я не понимаю сам алгоритм, я понимаю если условие выполняется, то действие перед тем как стоит двоеточие, если нет, то после, я просто не понимаю зачем это?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
22.03.2013, 22:27
Цитата Сообщение от myself Посмотреть сообщение
я просто не понимаю зачем это
Для упрощения записи
0
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 46
22.03.2013, 22:37  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
Для упрощения записи
да блин, я понял это, что оно делает в самой программе, почему используется именно такой способ, для того чтобы круги не вылезали?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
22.03.2013, 22:57
А, вот в чём заковыка. Это нужно всего лишь для случайного определения радиуса. Такого, чтобы он не вышел за одну из сторон. Т.е. если расстояние от точки до края по-вертикали больше расстояния от точки до края по-горизонтали, то для радиуса генерируется число не больше меньшего расстояния (т.е. не больше расстояния по горизонтали в данном случае). И наоборот
0
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 46
22.03.2013, 23:04  [ТС]
ну допустим у меня высота и ширина 500 и 600, и у нас в размещении например сгенерировались значения 10 10, потом в ифе мы сравниваем 500-10 и 600-10, т.е. 590 и 490 и рисуем круг меньше меньшего, тоесть меньше 490, тогда круг никак не влезет, так как радиус должен быть меньше 10, а взять может от 0 до 490
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
22.03.2013, 23:28
Виноват, не досмотрел. pnt — это не центр окружности, это левый верхний угол описанного прямоугольника. А r — получается диаметр окружности, а не радиус.
Т.е. если сгенерировали точку (10,10), то окружность будет диаметром меньше 490, скажем 200, а центр будет находиться (10+200;10+200), т.е. всегда внутри. Хитро...
0
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 46
22.03.2013, 23:48  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
а центр будет находиться (10+200;10+200)
почему так?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
23.03.2013, 00:01
По порядку. Для примера
x = 500
y = 600
ptn = (10;10)
r = 200 < (490-10) (допустим)
Центр будет находится в точке (10+100;10+100).Опечатка вышла
Но центр это только для тебя. Программе центр не нужен, она рисует эллипс, вписанный в прямоугольник, а прямоугольник создаём здесь.
C#
1
2
Size sz = new Size(r, r);
Rectangle rct = new Rectangle(pnt, sz);
1
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 46
23.03.2013, 00:07  [ТС]
Спасибо понял, а может можно как-нибудь это попроще сделать?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
23.03.2013, 00:10
Да куда уж проще? Что сложного?
0
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 46
23.03.2013, 00:11  [ТС]
ладно, на последок, почему именно 10+100?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
23.03.2013, 00:14
Ну, если мы приняли, что r = 200, а r — это длина стороны прямоугольника, центр вписанной окружности находится в точке пересечения срединных перпендикуляров или диагоналей. Так что к координатам ptn нужно прибавлять r/2
1
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 46
23.03.2013, 00:35  [ТС]
а, ещё ptn = (10;10) это как я понял точка верхнего левого угла прямоугольника, а r - его сторона, но если она равна 200, то он же вылазит вниз так как 200 больше 10, а внизу расстояние от точки до края 10, а с права нормально влазит
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
23.03.2013, 00:41
Цитата Сообщение от myself Посмотреть сообщение
внизу расстояние от точки до края 10
Почему? Координата считается от верхнего левого угла контейнера. Попробуй нарисовать в панели 300×300:
C#
1
2
3
Rectangle rect = new Rectangle(10,10,200,200);
g.DrawRectangle(new Pen(Color.Black,2),rect);
g.FillEllipse(Brushes.Red,rect);
0
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 46
23.03.2013, 00:51  [ТС]
то есть координата сверху вниз идёт от меньшего к большему, и с лево на право идёт от меньшего к большему?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
23.03.2013, 00:54
Да!
1
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 46
23.03.2013, 00:57  [ТС]
Спасибо большое, просто я даже таких простых вещей не знал, всё ориентировался по одной лекции и этому примеру, и в интернете нигде толком не нашёл обьяснения при работе с графикой
0
23.03.2013, 01:00

Не по теме:

Было бы желание учиться и разбираться. Я как представлю, сколько сам не знаю, так аж страшно становится

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.03.2013, 01:00
Помогаю со студенческими работами здесь

Нарисовать Круги
Люди выручите пожалуйста! Мне нужно нарисовать Круги чтоб они были на одинаковом расстояние и размер при помощи цыкал примерно как на...

Нарисовать круги
Написать программу, которая выводит на экран приведенный ниже узор.

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

Нарисовать круги на воде
for(i=0;i&lt;30;i++) { for(int it=0; it&lt;30; it++) { for(int q=0; q&lt;360; q++) { C_X=i*sin(q); ...

Нарисовать круги Эйлера
Как нарисовать круги Эйлера


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru