C ++ Заполнение одномерного массива для представления n-мерного объекта на основе отрезка прямой линии - PullRequest
1 голос
/ 09 июня 2010

ЧИТАЙТЕ ПЕРВЫМ: Я переписал этот вопрос с помощью друга, чтобы, надеюсь, более конкретно определить, что требуется.Его можно найти здесь

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

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

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

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

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

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

Еще одно определение того, какой тип объекта я пытаюсь представить:
В 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;
    }
}

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

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

РЕДАКТИРОВАТЬ: Очевидно, я пытаюсь заполнить этот массив, чтобы представить n-куб с наименьшим количеством пропущенных элементов для данного n, интервал и числоэлементы.Если это сделает мою цель более ясной.

1 Ответ

0 голосов
/ 09 июня 2010

Насколько я понимаю, вы не знаете, как обрабатывать каждый элемент в многомерном массиве (хранится как одномерный массив), где 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 на число двойных чисел на элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...