Прореживание облака точек10.12.2016, 09:52. Показов 5257. Ответов 19
Метки нет (Все метки)
Здравствуйте
Довольно много занимался подобными задачами, но вот нужна простенькая вещь - и ничего не лезет в голову. Есть облако из N точек в пр-ве. Нужно выкинуть из него некоторое кол-во точек чтобы сделать плотность более равномерной. Пользователь хочет сделать это 2 разными способами (2 подзадачи) - расстояние между любыми двумя точками не должно быть меньше заданного minD, сколько точек выкинуть без ограничений - выкинуть заданное кол-во точек чтобы получить облако из M точек (M < N). Интересует в первую очередь "дешевизна" решения, это всего лишь 2 малюсенькие опции. Разумеется "каждый с каждым" не проходит уже на 10K точек, а их может быть и намного больше С уважением Игорь
0
|
|
| 10.12.2016, 09:52 | |
|
Ответы с готовыми решениями:
19
Центр "облака" точек Отображение облака точек в 3D |
| 10.12.2016, 17:18 [ТС] | ||
|
- из координат данной точки получить "ключ" (напр поделить x, y, z на сторону и округлить) - если по этому ключу уже есть точка, то данную выкидываем, иначе оставляем Если не так - поправьте. А если так - то это еще не решение. Во-первых могут быть "близкие соседи но в разных кубах". Во-вторых, где взять сторону куба для второй вариации?
0
|
||
| 10.12.2016, 19:58 | |
|
Igor3D
Вы меня в целом правильно поняли. Хорошо пусть будет областью куб (это не принципиально). Суть разбиения состоит в том, что "куб" - это как бы "большая" точка. То есть мы переходим от очень большого количества точек к меньшему количеству. Вот вы говорите, что может получится где-то не очень равномерно. Да. Вы правы. Вы тысячу раз правы!! Но ни один алгоритм не даст вам такой гарантии. Погрешность в плотности была, есть и будет... ... Есть и другой вариант, при котором в принципе не будет рядом стоящих точек. Итак предполагается, что все пространство разбито на кубики. Диаметр кубиков должен быть равен заданному вами расстоянию minD. В этом случае вы берете первый (по счету) кубик и оставляете в нем одну точку, во всех остальных кубиках, соприкасаемых с данным (их 26 штук) точки полностью выбрасываются. ... Если у вас задан трёхмерный массив, то все операции удобно провести в трёхкратном цикле с шагом равным 2. Вы понимаете, кубик с точкой будет отделен от другого кубика с точкой пустым кубиком. И условие плотности будет соблюдено.
0
|
|
| 11.12.2016, 13:14 [ТС] | ||||
|
Да, и по-прежнему ничего не видно для второго варианта (удалить заданное число точек)
0
|
||||
| 11.12.2016, 14:57 | |
|
Igor3D
Есть другой вариант, который тоже основан на принципе "разделяй и властвуй". Надо трёхмерное пространство разрезать на слои как пирог. Расстояние между слоями должно быть по определению minD. Надеюсь вы уже догадались, что слои должны чередоваться. Слой, который содержит точки лежит на слое, в котором нет точек (а если они есть, то все точки выкидываются). Затем каждый слой (некоторое подобие плоскости имеющей толщину) делится параллельными линиями на части. Расстояние между линиями равно minD. Здесь тоже полоски делятся на те, что содержат точки и те, в которых их быть не должно. (если точки есть, то выбрасываются). Эти полосы чередуются... ... Вам в принципе может хватить одного линейного массива если, конечно все данные хранятся в файле (а где же еще если их к примеру миллион)
0
|
|
|
2619 / 1630 / 266
Регистрация: 19.02.2010
Сообщений: 4,325
|
||
| 11.12.2016, 21:58 | ||
|
Если нужно просто уменьшить число точек - то метод серединного сечения многомерного пространства, до тех пор, пока у какого-нибудь параллелепипеда сторона не станет меньше некоторого порога (проще контролировать размер стороны, чем вычислять расстояние между центрами соседних паралеллепипедов для последующего сравнения с minD). После этого все точки, попавшие в каждый параллелепипед, выбрасываются, кроме ближайшей к центру. При необходимости - можно ускорить последний этап, не вычисляя все расстояния между точками в гиперпараллелепипеде и его центром, а заменяя все эти точки на центр параллелепипеда (думаю, для практики будет допустима такая "погрешность"). А самО серединное сечение должно работать быстро - см на длительность оптимизации цветовой палитры этим алгоритмом для многомегапиксельных фоток (при операции сокращения числа цветов в палитре).
0
|
||
| 12.12.2016, 10:02 [ТС] | ||||
|
Ну и попробую еще раз: может как-то планировать чтобы код/решение были общими для обеих подзадач?
0
|
||||
|
2619 / 1630 / 266
Регистрация: 19.02.2010
Сообщений: 4,325
|
||
| 12.12.2016, 22:33 | ||
|
На русском по методу медианного сечения тоже нагугливается немного. Просто 20 лет назад, в русском PC Magazine 7/95, переводилось именно как серединное сечение. А импринтинг - вещь заразная
0
|
||
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
| 13.12.2016, 16:35 | |
|
Все данные точки записать в массив известной длинны. Опция разрежение это количество запросов к рендом генератору. Например задаем разрежение 1000.
От случайного генератора 1000 раз спрашиваем индекс в массиве точек которую удаляем.
0
|
|
| 14.12.2016, 11:16 [ТС] | |||
На всякий случай уточню/подчеркну - можно только выкидывать, никаких новых точек создавать нельзя
0
|
|||
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
| 14.12.2016, 11:53 | |
|
Переводим случайное число в номер индекса в массиве известной длинны и удаляем эту точку.
0
|
|
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
||
| 14.12.2016, 12:18 | ||
|
Можно, например, выбрать произвольную точку и выкинуть все остальные. Все требования соблюдены, но вряд ли это то, что нужно Пользователю. Точно так же, если мы возьмём, например, простейший алгоритм (выбираем точку, ищем и удаляем соседей в заданном диапазоне, выбираем следующую точку), то результат будет зависеть от того, в каком порядке мы выбираем точки. Устроит ли это Пользователя?
0
|
||
| 14.12.2016, 13:29 [ТС] | |||
Предложите лучшую формулировку, никто же не возражает. )
0
|
|||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
|
| 14.12.2016, 14:05 | |
|
0
|
|
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
|||
| 14.12.2016, 15:56 | |||
|
Что касается "инициативы", то есть две разные работы: постановка задачи и решение задачи. Для выполнения первой мне бы понадобился ответ на вопрос "Для чего пишется эта программа". Краткий ответ на этот вопрос занял бы приблизительно 10 страниц А4. Более компактный ответ, скорее всего, лишь породил бы дополнительные вопросы. Поэтому мне тупо лень этим заниматься (тем более, что телепаты в отпуске).
0
|
|||
| 14.12.2016, 16:30 [ТС] | ||
|
0
|
||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
|
| 14.12.2016, 20:09 | |
|
Похоже, что Вы не прочитали алгоритм, который я предложил.
0
|
|
| 15.12.2016, 12:19 [ТС] | ||
|
Мои соображения. Думаю что неизбежен какой-то "базовый поиск" который надо повторить для всех N точек. Всякий раз базовый поиск выдает какое-то число "пар" (точка-точка) которые надо сохранить, и на основании всех этих пар уже решать кого удалять. И тут начинаются неясности. В первой подзадаче нужно сохранять все пары с расстоянием < minD, число сохраненных может оказаться слишком велико. Во второй наоборот мало если ограничить число пар числом удаляемых - ведь одна точка может входить в неск пар. Решать это за 2 и более прохода не хотелось бы. С остальным вроде бы нормуль. Базовый поиск - ну у меня kd-tree всегда под рукой (кстати его называют и "медианным деревом"). Выбор удаляемой - ну просто та что входит в наибольшее число пар.
0
|
||
| 15.12.2016, 12:19 | |
|
Помогаю со студенческими работами здесь
20
Фигура из облака точек Объединение облака точек Построение Евклидова облака точек Импорт и отображение облака точек Как из облака точек распознавать объекты? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
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 .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|