Равноудаленные точки куба

Мне нужно инициализировать некоторые трехмерные точки, и я хочу, чтобы они были равномерно распределены по всему кубу. Есть ли какие-то творческие способы сделать это?

Я использую итеративный алгоритм максимизации ожиданий и хочу, чтобы мои начальные векторы «равномерно охватывали» пространство.

Например, предположим, что у меня есть восемь точек, которые я хочу равномерно распределить в кубе размером 1x1x1. Я бы хотел, чтобы точки в углах куба с длиной стороны 0,333 находились в центре большего куба.

2D-пример ниже. Обратите внимание, что красные точки равноудалены друг от друга и от краев. Я хочу то же самое для 3D.

Равноудаленные точки

В тех случаях, когда количество точек не имеет целого кубического корня, я могу оставить некоторые «пробелы» в расположении.

В настоящее время я беру кубический корень из количества точек и использую его для расчета количества точек и желаемого расстояния между ними. Затем я перебираю точки и увеличиваю координаты X, Y и Z (в шахматном порядке, чтобы Y не увеличивался до тех пор, пока X не вернется к 0, то же самое для Z с учетом Y).

Если есть простой способ сделать это в MATLAB, я бы с удовольствием им воспользовался.


person M. Dudley    schedule 03.07.2009    source источник
comment
Вы не полностью определили проблему, например, будет много возможных расположений 2 точек в 3D-кубе.   -  person quant_dev    schedule 04.07.2009
comment
3D часто трудно объяснить в тексте. Можете ли вы дать нам эскиз?   -  person ralphtheninja    schedule 04.07.2009
comment
Почему ваши 8 очков должны быть в кубе 1/3? Почему не куб 1/2 или куб 9/10?   -  person RBarryYoung    schedule 04.07.2009
comment
Я хочу, чтобы все точки были равноудалены друг от друга и от сторон содержащего куба.   -  person M. Dudley    schedule 04.07.2009
comment
равноудалены друг от друга и от сторон объемлющего куба? Я не уверен, что всегда найдется решение, удовлетворяющее этим условиям.   -  person RBarryYoung    schedule 04.07.2009
comment
Просто решить один раз... У меня есть алгоритм, который работает, но мне любопытно, есть ли лучшие способы.   -  person M. Dudley    schedule 04.07.2009
comment
+1: Но это определенно интересно...   -  person RBarryYoung    schedule 04.07.2009
comment
Пример с 8 точками и кубом 1x1x1 легко изобразить. Как, скажем, распределить 10 баллов? Означает ли это, что вы распределите первые 8, как указано выше, и 2 оставшихся очка случайным образом?   -  person ralphtheninja    schedule 04.07.2009


Ответы (5)


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

l=linspace(0,1,n+2);
x=l(2:n+1); y=x; z=x;
[X, Y, Z] = meshgrid(x, y, z);

Затем для каждой позиции в матрицах координаты этой точки задаются соответствующими элементами X, Y и Z. Если вам нужны точки, перечисленные в одной матрице, чтобы каждая строка представляла точку, с тремя столбцами для координат x, y и z можно сказать:

points(:,1) = reshape(X, [], 1);
points(:,2) = reshape(Y, [], 1);
points(:,3) = reshape(Z, [], 1);

Теперь у вас есть список из n^3 точек сетки по всему единичному кубу, исключая границы. Как предлагали другие, вы, вероятно, можете случайным образом удалить некоторые точки, если хотите меньше очков. Это было бы легко сделать, используя randi([0 n^3], a, 1) для создания a индексов удаляемых точек. (Не забудьте проверить наличие дубликатов в матрице, возвращаемой randi(), иначе вы можете удалить недостаточное количество точек.)

person user57368    schedule 03.07.2009

Предлагаемая вами стратегия выборки известна как сетка Сухарева, которая является оптимальной стратегией выборки с низкой дисперсией, http://planning.cs.uiuc.edu/node204.html. В случаях, когда количество выборок не равно n^3, выбор точек, которые следует исключить из сетки, не имеет значения с точки зрения выборки.

На практике можно использовать методы выборки с низким расхождением (квазислучайные) для достижения очень хороших результатов в трех измерениях, http://planning.cs.uiuc.edu/node210.html. Возможно, вы захотите взглянуть на использование последовательностей Холтона и Хаммерсли.

person Andrew Walker    schedule 03.07.2009
comment
Этот ответ интересен и может быть тем, что я ищу, но на данный момент это выходит за рамки моего понимания. - person M. Dudley; 07.07.2009

Это похоже на упаковку сфер.

person starblue    schedule 03.07.2009

Случайным образом выберите точки внутри куба, а затем вычислите векторы до ближайшего соседа или стены. Затем расширьте конечные точки наименьшего вектора на экспоненциально затухающий размер шага. Если вы делаете это итеративно, точки должны сходиться к оптимальному решению. Это работает даже в том случае, если количество точек не является кубическим.

person Neil G    schedule 03.07.2009
comment
Я делал это раньше, но теперь мне нужно детерминированное решение. - person M. Dudley; 05.07.2009

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

person Javier    schedule 03.07.2009
comment
Как вы определяете хороший ГСЧ? В конце концов, если оно случайное, оно не должно давать приближений для этой задачи. - person lacop; 04.07.2009
comment
Мне нужен детерминированный алгоритм. - person M. Dudley; 07.07.2009