2010-06-09 6 views
1

READ FIRST: Я переписал этот вопрос с помощью друга, чтобы быть более конкретным в том, что требуется. Здесь можно найти hereC++ Заполнение массива 1D для представления n-мерного объекта на основе линейного отрезка

Я не очень разбираюсь в n-кубах, но я считаю, что это то, что я имею в виду как квадратное семейство.

Нового Вопрос Формулировка:
Возможно, я был недостаточно ясен. Я спрашиваю, как установить 1D-массив для хранения данных для облака из числа равномерно расположенных точек, которые образуют наиболее полное представление пространства, занимаемого n-кубом n измерений.

В 1D это просто заполнит массив серией 1D-координат, создавая сегмент линии. 1-куб.

В 2D, однако, это заполнило бы каждую первую координату значение x и каждую секунду для y, создавая максимально возможный квадрат для этого интервала и количества частиц. Самый полный возможный 2-куб.

В 3D это заполняло бы все сначала х, каждую секунду с y и каждую треть с z, генерируя наиболее полный возможный куб для этого интервала и количества частиц. Самый полный возможный 3-куб.

Я хочу быть в состоянии сделать это для любой разумной комбинации количества частиц, расстояния и размеров. В идеале я мог бы сделать, по крайней мере до 4-куба с использованием общего алгоритма заполнения для всех п-кубов инициализируется double * parts_

еще одно определение, какой тип объекта я пытаюсь представить:
В 1D его в линия. Проведите его по второму размеру, превращаясь в квадрат. Проведите квадрат через третий, он станет кубом. Я предполагаю, что это поведение распространяется на три измерения и хочет сохранить облако точек, представляющих пространство, занимаемое одним из этих объектов любого разумного размера, расстояния и количества точек в 1D-массиве.

Первоначальная формулировка вопроса:
Я изо всех сил, чтобы найти хороший способ, чтобы поставить этот вопрос, но здесь идет. Я делаю систему, которая использует 1D-массив, реализованный как double * parts_ = new double[some_variable];. Я хочу использовать это, чтобы удерживать координаты для системы частиц, которые могут выполняться в разных измерениях.

Что я хочу сделать, это написать общий алгоритм заполнения для заполнения этого параметра в n-размерах с общим приращением во всем направлении к переменному размеру. Примеры будут лучше всего служить.

Рассмотрим случай, когда число частиц, хранящихся в массиве 4

В 1D это производит 4 элементов в массиве, потому что каждая частица имеет только одну координату.
1D:
{0, 25, 50, 75};
В 2D это производит 8 элементов в массиве, потому что каждая частица имеет две координаты ..
2D:
{0, 0, 0, 25, 25, 0, 25, 25}
В 3D это производит 12 элементов в массиве, потому что каждая частица теперь имеет три координаты
{0, 0, 0, 0, 0, 25, 0, 0, 50, ... }

Эти примеры еще не совсем точны, но они, надеюсь, будет достаточно.

Как я хотел бы сделать это нормально для двух измерений:

int i = 0; 
for(int x = 0; x < parts_size_/dims_/dims_ * 25; x += 25) { 
    for(int y = 0; y < parts_size_/dims_/dims_ * 25; y += 25) { 
     parts_[i] = x; 
     parts_[i+1] = y; 
     i+=2; 
    } 
} 

Как я могу осуществить это за п-размеров, где 25 может быть любое число?

Прямая часть состоит в том, что мне кажется логичным, что линия является несколько правильной формой в 1D, как и квадрат в 2D, и куб в 3D. Мне кажется, что из этого следует, что в этом семействе будут аналогичные формы, которые могут быть реализованы для 4D и более высоких измерений с помощью аналогичного шаблона заполнения. Это форма, которую я хочу настроить для представления массива.

EDIT: По-видимому, я пытаюсь заполнить этот массив, чтобы представить n-куб с наименьшим количеством отсутствующих элементов для заданного n, расстояния и количества элементов. Если это делает мою цель более ясной.

+1

Отформатируйте свой код, используя кнопку '101010' на странице редактирования. – sbi

+0

Cheers. Это намного проще, чем то, что я пытался сделать с кавычками/экранами блоков. – Ben

+0

Почему вы хотите сохранить многомерный массив в одном массиве измерений и не использовать массив с соответствующим количеством измерений? – Rudi

ответ

0

Как я понимаю, вы не знаете, как обрабатывать каждый элемент в многомерном массиве (хранится как 1D-массив), где N - произвольное количество измерений.

Обработка многомерного массива с произвольным числом измерений выглядит следующим образом:

#include <stdio.h> 
#include <vector> 
using std::vector; 

int main(int argc, char** argv){ 
    int index = 0; 
    const int numDimensions = 10; 
    vector<int> counters; 
    vector<int> dimensionSizes; 
    counters.resize(numDimensions); 
    dimensionSizes.resize(numDimensions); 

    for (int i = 0; i < numDimensions; i++){ 
     counters[i] = 0; 
     dimensionSizes[i] = 13; 
    } 

    long long arraySize = 1; 
    for (int i = 0; i < numDimensions; i++) 
     arraySize *= dimensionSizes[i]; 


    printf("%d\n", arraySize); 
    for (int elementIndex = 0; elementIndex < arraySize; elementIndex++){ 
     fprintf(stderr, "element %08d: ", elementIndex); 
     for (int i = 0; i < numDimensions; i++)  
      fprintf(stderr, "%04d ", counters[i]); 
     fprintf(stderr, "\n"); 
    //at this point you have 1D element index 
    //AND all n-dimensional coordinates stored in counters array. 
    //Just use them to for your data 
    //"counters" is N-dimensional coord. XYZW etc. 

     for (int i = 0; i < numDimensions; i++){ 
      counters[i] = counters[i] + 1;     
      if (counters[i] < dimensionSizes[i]) 
       break; 
      else 
       counters[i] = 0; 
     } 
    } 


    return 0; 
} 

Просто сделать массив структур, вы должны получить доступ в N измерениях, и доступ к ним, используя вычисленный индекс где-то после того, как комментарий. Лучше использовать массив структур, представляющих данные, которые вы хотите сохранить в N размерности. Если вы не хотите этого делать, вам придется умножить elementIndex на количество удвоений на элемент.

+0

Не совсем вопрос, который я задал. Спасибо за ваше решение. Я переписал свой вопрос в надежде на ясность. Это просто сложно, когда вы можете понять концепцию, но не знаете правильного имени для нее. Я думаю, что n-кубы правильные. – Ben

Смежные вопросы