Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
2 / 2 / 1
Регистрация: 07.01.2012
Сообщений: 54

Как сделать круг при большом количестве пикселей

21.10.2012, 21:16. Показов 2718. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
доброго времени суток!
пользователь задает количество пикселей, они распределяются по канве рандомно. далее надо сделать так, чтобы при скоплении большого кол-ва точек(пикселей) образовался круг.
как точки рандомно задать знаю:
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
void PaintPlanet()
  {
  }
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
       int x,y;
int p = 0;
 p = StrToInt(Form1->Edit1->Text);
 for (int i = 0; i < p; i++)
  {
    x = random(Form1->PaintBox1->Width)+1;
    y = random(Form1->PaintBox1->Height)+1;
   Form1->PaintBox1->Canvas->Pixels[x][y] = clYellow;
 }
 
}
//---------------------------------------------------------------------------
а вот как сделать круг при большом количестве пикселей не совсем точно понимаю. для простоты можно форму разделить на 4 части и в какой части будет бОльшее кол-во точек, в той и рисовать круг. а вот можно на форму вынести 4 paintbox'a и сделать для них проверку(или чем лучше форму разделить на 4 части)? и как проверить в какой из 4х областей нах-ся больше точек?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.10.2012, 21:16
Ответы с готовыми решениями:

Сильно тормозит отрисовка ListView при большом количестве элементов
Пример в аттаче. Запускаем программу, жмём кнопку Fill. Происходит заполнение 10.000 строк. У меня этот процесс идёт несколько секунд....

Убирание и замена тегов в большом количестве файлов, как сделать?
Добрый день форумчане:) Заказчик запросил сделать сайт один один по структуре, и немного изменить меню и мыло(их там 6 или 7 разных а...

Как организовать работу с БД при большом количестве пользователей?
Здравсвуйте. У меня планируется работа с БД (Accsess, VBScript) на сайте, причем работа с БД одновременно планируется (т.е....

14
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.10.2012, 22:25
Я думаю, Вы не совсем точно описали (возможно - и поняли) задание. Задание видится более логичным, если точки (пиксели) располагаются на канве не в случайном беспорядке, а равноудаленно от единой точки на канве (центре окружности). Тогда вначале беспорядочное размещение точек по мере их накопления приобретет форму окружности. Так что рандомным должен быть угол радиуса (от 0 до 360), а сам радиус и центр должны быть статичными.
0
 Аватар для T2skler
50 / 50 / 6
Регистрация: 16.05.2012
Сообщений: 232
21.10.2012, 22:25
Можно сделать 4 счётчика и при прохождении цикла проверять точки X и Y на попадение в одну из 4-х частей.
C++
1
2
if (X < Width/2 && Y < Height/2)
Part1++;
1
2 / 2 / 1
Регистрация: 07.01.2012
Сообщений: 54
21.10.2012, 22:53  [ТС]
nick42, Ваша мысль мне понятноа но нет, по заданию расположение пикселей выбирается произвольно. допустим, форма разделена на 4 условные части, пользователь задал 1000 точек, 500 из них располагаются в левой верхней части, соответственно, круг должен возникнуть в этой части
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.10.2012, 23:02
А кто "допускает" это разбиение поля на четыре (не семь, не восемь..) квадранта? Об этом говорится в задании? Ограничения на координаты точек имеются, или диапазон рандомности плюс-минус бесконечность?

Не по теме:

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

0
2 / 2 / 1
Регистрация: 07.01.2012
Сообщений: 54
21.10.2012, 23:05  [ТС]
в задании говорится а разбиении на 4 усл части (извините, что сразу не указано). ограничений нет
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.10.2012, 23:09
Цитата Сообщение от smthelse Посмотреть сообщение
в задании говорится а разбиении на 4 усл части (извините, что сразу не указано). ограничений нет
- тогда я б на Вашем месте не "темнил", а привел бы все задание; а то на форуме встречаются и такие, как я, - с узкоразвитой фантазией, которая порождает не всегда умные дополнительные вопросы и предположения.
0
2 / 2 / 1
Регистрация: 07.01.2012
Сообщений: 54
21.10.2012, 23:12  [ТС]
"Пользователь задает количество точек. Место появления точек выбирается произвольно. При скоплении точек в одном месте рождается круг. Форму разделить на 4 условные части и анализировать количество появившехся точек"
0
21.10.2012, 23:23

Не по теме:

Я, наверное, уйду спать (и пусть мне не приснятся кошмары)... Скопление точек в одном месте - это что, появление нового пикселя с повторившимися координатами? Круг рождается большой, маленький, самопроизвольно, в муках? Каковы условия этого разделения формы на 4 части? По какому критерию? Каким углом мозга "анализировать" это количество, которое задается пользователем? По количеству алкоголя у него в крови?
Спокойной ночи. Желаю успехов.

0
2 / 2 / 1
Регистрация: 07.01.2012
Сообщений: 54
21.10.2012, 23:30  [ТС]
код появления точек уже был представлен
C++
1
2
3
4
5
6
7
8
int x,y;
int p = 0;
 p = StrToInt(Form1->Edit1->Text);
 for (int i = 0; i < p; i++)
  {
    x = random(Form1->PaintBox1->Width)+1;
    y = random(Form1->PaintBox1->Height)+1;
   Form1->PaintBox1->Canvas->Pixels[x][y] = clYellow;
по-видимому, круг размером с одну из частей, т.е должен охватить все точки на этой части.
а какими должны быть условия разделения на 4 части? поровну поделить и все
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
22.10.2012, 19:20
Примерно так...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
TPaintBox * pb = Form1->PaintBox1;
int x, y, p = StrToInt(Form1->Edit1->Text), w = pb->Width, h = pb->Height, w2 = w/2, h2 = h/2,
        count_lefttop = 0, count_righttop = 0, count_rightbottom = 0, count_leftbottom = 0;
 
for ( int i = 0; i < p; ++i ) {
    x = random( w ) + 1;
    y = random( h ) + 1;
    pb->Canvas->Pixels[x][y] = clYellow;
    ( x <= w2 && y <= h2 ) ? ++count_lefttop:
        ( ( x > w2 && y <= h2 ) ? ++count_righttop: 
        ( ( x <= w2 && y > h2 ) ? ++count_leftbottom: 
        ( ( x > w2 && y > h2 ) ? ++count_rightbottom: 0 ) ) );
}
pb->Canvas->Brush->Color = clRed;
if( count_lefttop >= 500 ) pb->Canvas->Ellipse( 10, 10, w2 - 10, h2 - 10 );
if( count_righttop >= 500 ) pb->Canvas->Ellipse( w2 + 10, 10, w - 10, h2 - 10 );
if( count_rightbottom >= 500 ) pb->Canvas->Ellipse( w2 + 10, h2 + 10, w - 10, h - 10 );
if( count_leftbottom >= 500 ) pb->Canvas->Ellipse( 10, h2 + 10, w2 - 10, h - 10 );
1
2 / 2 / 1
Регистрация: 07.01.2012
Сообщений: 54
22.10.2012, 19:58  [ТС]
C++
1
2
3
4
    ( x <= w2 && y <= h2 ) ? ++count_lefttop:
        ( ( x > w2 && y <= h2 ) ? ++count_righttop: 
        ( ( x <= w2 && y > h2 ) ? ++count_leftbottom: 
        ( ( x > w2 && y > h2 ) ? ++count_rightbottom: 0 ) ) );
это, как я поняла, 4 части формы. но с синтаксисом с++ я, по-видиомому, не до конца знакома, объясните пож-та знак вопроса после скобок и двоеточие. какой-то перебор?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
22.10.2012, 20:43
Функционал похож на if - else if - else, только запись мне больше нравится. Можно обойтись без скобок, кстати, это я для наглядности.
Тернарная условная операция
1
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
22.10.2012, 21:07
Немного переделал вариант от BRcr
(с один кругом и выводом инфы):
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
void __fastcall TForm1::Button1Click(TObject *Sender) // то что ниже - вставить в обработчик нажатия кнопки
{
        TPaintBox * pb = PaintBox1;
        pb->Repaint();
        TCanvas *canva = pb->Canvas;
 
        enum { LEFT_TOP, RIGHT_TOP, LEFT_BOTTOM, RIGHT_BOTTOM }; // ïåðå÷èñëåíèå
        int max_place = -1;
 
        // â Edit1 çàäàåòñÿ âñåãî òî÷åê
        int x, y, p = Edit1->Text.ToInt(), w = pb->Width, h = pb->Height, w2 = w/2, h2 = h/2;
        int count[4] = {0}, max_count = 0;
 
 
        // ðèñóåì òî÷êè
        for ( int i = 0; i < p; i++ )
        {
                x = random(w);
                y = random(h);
                canva->Pixels[x][y] = clBlue;
                if ( x < w2 && y < h2 ) count[LEFT_TOP]++;
                else if ( x >= w2 && y < h2 ) count[RIGHT_TOP]++;
                else if ( x < w2 && y >= h2 ) count[LEFT_BOTTOM]++;
                else if ( x >= w2 && y >= h2 ) count[RIGHT_BOTTOM]++;
        }
 
        // îïðåäåëÿåì ÷àñòü ñ áîëüøèì ñêîïëåíèåì òî÷åê
        for ( int i = 0; i < 4; i++ )
        {
                if ( count[i] > max_count )
                {
                        max_count = count[i];
                        max_place = i;
                }
        }
 
        // âûâîä êðóãà
        canva->Brush->Color = clRed;
        if ( max_place == LEFT_TOP )
        {
                canva->Ellipse( 10, 10, w2 - 10, h2 - 10 );
        }
        else if ( max_place == RIGHT_TOP )
        {
                canva->Ellipse( w2 + 10, 10, w - 10, h2 - 10 );
        }
        else if ( max_place == LEFT_BOTTOM )
        {
                pb->Canvas->Ellipse( 10, h2 + 10, w2 - 10, h - 10 );
        }
        else if ( max_place == RIGHT_BOTTOM )
        {
                pb->Canvas->Ellipse( w2 + 10, h2 + 10, w - 10, h - 10 );
        }
 
        // вывод текста (количество точек) по середине каждой части
        canva->Brush->Style = bsClear;
        canva->TextOut( (w2 - canva->TextExtent(count[LEFT_TOP]).cx) / 2,
                        (h2 - canva->TextExtent(count[LEFT_TOP]).cy) / 2, count[LEFT_TOP] );
        canva->TextOut( (w2 - canva->TextExtent(count[RIGHT_TOP]).cx) / 2 + w2,
                        (h2 - canva->TextExtent(count[RIGHT_TOP]).cy) / 2, count[RIGHT_TOP] );
        canva->TextOut( (w2 - canva->TextExtent(count[LEFT_BOTTOM]).cx) / 2,
                        (h2 - canva->TextExtent(count[LEFT_BOTTOM]).cy) / 2 + h2, count[LEFT_BOTTOM] );
        canva->TextOut( (w2 - canva->TextExtent(count[RIGHT_BOTTOM]).cx) / 2 + w2,
                        (h2 - canva->TextExtent(count[RIGHT_BOTTOM]).cy) / 2 + h2, count[RIGHT_BOTTOM] );
}
1
2 / 2 / 1
Регистрация: 07.01.2012
Сообщений: 54
22.10.2012, 21:26  [ТС]
всем большое спасибо!
kzru_hunter, все понятно, разобралась
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.10.2012, 21:26
Помогаю со студенческими работами здесь

Как освобождать память при большом количестве записей в TQuery?
Доброе время суток, Вопрос такой, как освобождать память при большом колличестве записей(999 999 шт.) в TQuery? винда просто...

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

Json не сработал при большом количестве информации
отдельно ссылки проверял, обе работают, когда пытаюс ьдекодировать в json - первая работает, а вторая нет, почему? 1 код: $urlsItem =...

Утечка памяти при большом количестве сообщений
Есть окно сообщения.При новом сообщения создается новое окно(анимировано),старое закрывается(Close).В этом окне есть одно Image.Если много...

Unrecognized token при большом количестве совпадений
Здравствуйте, спасибо Вам всем большое за неоднократную помощь! Хочу предупредить сразу, что я совсем новичок. С такой ошибкой уже...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru