Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 11.11.2020
Сообщений: 132

Заполнение окружности рандомными пикселями

30.04.2022, 22:24. Показов 2374. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Реализовал код для заполнения прямоугольника рандомными пикселями, помогите реализовать тоже самое, но уже для окружности с координатами центра W и H и радиусом RK
C#
1
2
3
4
5
6
7
8
9
10
double[] cwidth = new double[(int)E];
            double[] cheight = new double[(int)E];
            var rnd = new Random();
            for (int z = 0; z < E - 1; z++)
            {
                cwidth[z] = rnd.Next((int)(W - RK), (int)(W + RK));
                cheight[z] = rnd.Next((int)(H - RK), (int)(H + RK));
                this.g.SetPixel((int)cwidth[z], (int)cheight[z], button8.BackColor);
                pictureBox1.Image = this.g;
            }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.04.2022, 22:24
Ответы с готовыми решениями:

Заполнение ступенчатого массива рандомными числами
Всем привет. У меня такая проблема: ступенчатый массив создан, но я не знаю как заполнить его рандомными числами. Вот мой ступенчатый...

Заполнение рандомными числами
Здравствуйте, как сделать автозаполнение textBox-ов рандомными числами ? На скриншоте показано, что текст боксы заполнены вручную. ...

Заполнение DataGridView рандомными значениями
Добрый вечер, у меня возникла проблема с решением одной задачи. Так вот, у меня есть элемент DataGridView c оформленными строками и...

21
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
02.05.2022, 15:04
Лучший ответ Сообщение было отмечено Fric как решение

Решение

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Fric Посмотреть сообщение
что k - это то что выберет пользователь?
Да.
Можно и прямо задавать k в методе получения точек вместо count (их количества).

В идеале бы задавать прямо плотность заполнения, но тогда логика получения рандомных точек сильно изменится, так как нужно будет исключать точки попадающие друг на друга.
А при плотности заполнения близкой к единице, таких точек будет очень много, и их исключение повлечёт значительное увеличение времени вычисления.
Для избегания этого при плотности > 0.5 инвертируется кисть с плотностью (1-ρ).
Как следствие - понадобится как минимум метод для инвертации кисти.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
02.05.2022, 20:30
Fric, добавил перегрузки возвращающие множества (HashSet) точек для кисти (прямоугольной, круглой, треугольной) с заданной плотностью точек.
Код не тестировал. Если будут ошибки - напишите.
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
namespace Core2022
{
 
    public static partial class StaticMethods
    {
        private static readonly Random random = new Random();
        public static (int x, int y)[] GetRandomPoints(int x0, int y0, int x1, int y1, int count, Func<int, int, bool> func)
        {
            (int x, int y)[] points = new (int x, int y)[count];
            if (x0 > x1)
                (x0, x1) = (x1, x0);
            if (y0 > y1)
                (y0, y1) = (y1, y0);
            x1++;
            y1++;
 
            for (int i = 0; i < points.Length; i++)
            {
                int x = random.Next(x0, x1);
                int y = random.Next(y0, y1);
                if (func(x, y))
                {
                    points[i] = (x, y);
                }
                else
                {
                    i--;
                }
            }
 
            return points;
        }
 
        public static HashSet<(int x, int y)> GetRandomSetPoints(int x0, int y0, int x1, int y1, int count, Func<int, int, bool> belongs)
        {
            HashSet<(int x, int y)> points = new HashSet<(int x, int y)>(count);
            if (x0 > x1)
                (x0, x1) = (x1, x0);
            if (y0 > y1)
                (y0, y1) = (y1, y0);
            x1++;
            y1++;
 
            for (int i = 0; i < count; i++)
            {
                int x = random.Next(x0, x1);
                int y = random.Next(y0, y1);
                if (!belongs(x, y) || !points.Add((x, y)))
                {
                    i--;
                }
            }
 
            return points;
        }
        public static HashSet<(int x, int y)> GetRandomSetPoints(int x0, int y0, int x1, int y1, Func<int, int, bool> belongs, int area, double p)
        {
            if (p < 0 || p > 1)
                throw new ArgumentOutOfRangeException(nameof(p), "Плотность задаётся коэффициентом от 0 до 1");
 
            if (p == 0)
                return new HashSet<(int x, int y)>();
 
 
 
            if (p > 0.5)
                return GetInvertBrush(x0, y0, x1, y1, AlwaysTrue, GetRandomSetPoints(x0, y0, x1, y1, belongs, area, 1.0 - p));
 
            return GetRandomSetPoints(x0, y0, x1, y1, (int)(area * p), belongs);
        }
 
        public static HashSet<(int x, int y)> GetInvertBrush(int x0, int y0, int x1, int y1, Func<int, int, bool> func, HashSet<(int x, int y)> brush)
        {
            (int xMin, int yMin, int xMax, int yMax, int width, int height) = GetRect(x0, y0, x1, y1);
            int count = width * height - brush.Count;
 
            HashSet<(int x, int y)> points = new HashSet<(int x, int y)>(count);
 
            for (int x = 0; x < x1; x++)
            {
                for (int y = 0; y < y1; y++)
                {
                    if (func(x, y) && !brush.Contains((x, y)))
                    {
                        points.Add((x, y));
                    }
                }
            }
 
            return points;
        }
 
        public static (int x, int y)[] GetRandomPointsOfRectangle(int x0, int y0, int x1, int y1, int count)
            => GetRandomPoints(x0, y0, x1, y1, count, (x, y) => true);
 
        public static HashSet<(int x, int y)> GetRandomPointsOfRectangle(int x0, int y0, int x1, int y1, double p)
        {
            (int xMin, int yMin, int xMax, int yMax, int width, int height) = GetRect(x0, y0, x1, y1);
 
            return GetRandomSetPoints(x0, y0, x1, y1, AlwaysTrue, width * height, p);
        }
        public static bool AlwaysTrue(int x, int y) => true;
        private static (int xMin, int yMin, int xMax, int yMax, int width, int height) GetRect(int x0, int y0, int x1, int y1)
        {
            if (x0 > x1)
                (x0, x1) = (x1, x0);
            if (y0 > y1)
                (y0, y1) = (y1, y0);
            x1++;
            y1++;
 
            int w = x1 - x0;
            int h = y1 - y0;
 
            return (x0, y0, x1, y1, w, h);
        }
 
        public static (int x, int y)[] GetRandomPointsOfCircle(int xCenter, int yCenter, int radius, int count)
            => GetRandomPoints(xCenter - radius, yCenter - radius, xCenter + radius, yCenter + radius, count,
                (x, y) =>
                {
                    int dx = xCenter - x;
                    int dy = yCenter - y;
                    return (dx * dx + dy * dy) <= radius * radius;
                });
 
        public static HashSet<(int x, int y)> GetRandomPointsOfCircle(int xCenter, int yCenter, int radius, double p)
        {
            int xMin = xCenter - radius;
            int yMin = yCenter - radius;
            int xMax = xCenter + radius;
            int yMax = yCenter + radius;
 
            int r2 = radius * radius;
 
            int area = (int)(Math.PI * r2);
 
 
            return GetRandomSetPoints(xMin, yMin, xMax, yMax,
                           (x, y) =>
                           {
                               int dx = xCenter - x;
                               int dy = yCenter - y;
                               return (dx * dx + dy * dy) <= radius * radius;
                           },
                           area, p);
        }
 
 
        public static HashSet<(int x, int y)> GetRandomPointsOfTriangle(int x1, int y1, int x2, int y2, int x3, int y3, double p)
        {
            int xMin = x1;
            if (xMin > x2)
                xMin = x2;
            if (xMin > x3)
                xMin = x3;
 
            int xMax = x1;
            if (xMax < x2)
                xMax = x2;
            if (xMax < x3)
                xMax = x3;
 
            int yMin = y1;
            if (yMin > y2)
                yMin = y2;
            if (yMin > y3)
                yMin = y3;
 
            int yMax = y1;
            if (yMax < y2)
                yMax = y2;
            if (yMax < y3)
                yMax = y3;
 
            int dx21 = x2 - x1;
            int dy21 = y2 - y1;
            int dx32 = x3 - x2;
            int dy32 = y3 - y2;
            int dx13 = x1 - x3;
            int dy13 = y1 - y3;
 
            double l21 = Math.Sqrt(dx21 * dx21 + dy21 * dy21);
            double l32 = Math.Sqrt(dx32 * dx32 + dy32 * dy32);
            double l13 = Math.Sqrt(dx13 * dx13 + dy13 * dy13);
 
            double perim = l21 + l32 + l13;
            perim /= 2;
 
            int area = (int)Math.Sqrt(perim * (perim - l13) * (perim - l21) * (perim - l32));
 
 
            return GetRandomSetPoints(xMin, yMin, xMax, yMax, 
                           (x, y) =>
                           {
                               int scl1 = (x1 - x) * dy21 - dx21 * (y1 - y);
                               int scl2 = (x2 - x) * dy32 - dx32 * (x2 - x);
                               int scl3 = (x3 - x) * dy13 - dx13 * (x3 - x);
 
                               if (scl1 > 0)
                                   return scl2 >= 0 && scl3 >= 0;
                               if (scl1 < 0)
                                   return scl2 <= 0 && scl3 <= 0;
                               if (scl2 > 0)
                                   return scl3 >= 0;
                               if (scl2 < 0)
                                   return scl3 <= 0;
                               return true;
 
                           },
                           area, p);
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.05.2022, 20:30

Создание БД и таблиц и заполнение их рандомными данными
Добрый день. Кейс следующий, юзерЪ вводит имя сервера и бд, если такой бд нет, её нужно создать. С этим проблем нет, заюзал просто...

Заполнение кнопок рандомными цветами с ограничением
Сделал 2 листа, в одном 6 кнопок, во втором 3 цвета и рандомно заполняю эти баттоны цветами из листа. Но, заполняются они хаотично. Как мне...

Рандомное заполнение окружности пикселями
Имеется окружность радиусом R и координатами центра W и H, необходимо рандомно пикселями заполнить её.

Рандомное заполнение круга пикселями
Всем доброго времени суток! Не раз выручали ребята на форуме, за что очень благодарен им :) Надеюсь, в этот раз не сочтут мою просьбу за...

Заполнение массива рандомными числами
есть последовательность чисел a1...a30. заполняю ее рандомными числами. нужно сделать так, чтобы эти числа попарно отличались друг от...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru