2014-01-27 4 views
0

Я кодирую, чтобы имитировать рост сферы в среде решения. Я делаю так.Создать кластер со случайным числом

  1. Создать пространство и положить ячейку в центр в качестве семени.

    pSpace = new char[nXRange * nYRange * nZRange]; 
    for (int i = 0; i < nZRange; i++) 
    for (int j = 0; j < nYRange; j++) 
    for (int k = 0; k < nXRange; k++) 
        pSpace[i * nXRange * nYRange + j * nXRange + k] = 0; 
    pSpace[nXRange * nYRange * nZRange/2 + nXRange * nYRange/2 + nXRange/2] = 1; 
    
  2. Создайте ячейку в решении. Позиция ячейки создается случайным числом.

    int nXPostion = (int)(((float)rand()/RAND_MAX) * (nXRange - 1)); 
    int nYPostion = (int)(((float)rand()/RAND_MAX) * (nYRange - 1)); 
    int nZPostion = (int)(((float)rand()/RAND_MAX) * (nZRange - 1)); 
    
  3. Рассчитайте изменение потенциала для создания соседей cell.Six новой ячейки проверяется в левом (L), правый (R), Front (F), позади (B), Вверх (T) и снизу (B *). Если соседи новой ячейки являются старой ячейкой как L на рисунке, изменение потенциала равно PA2A, иначе, если это не старая ячейка, а решение, как R, F, B, T и B * в цифра, это PA2S. Создание новой ячейки изменяет потенциал с помощью PCREATE. Таким образом, изменение потенциала

    fPotential = PCREATE + P(Left) + p(Right) + p(Front) + p(Behind) + p(Top) + p(Bottom); 
    
  4. Используйте случайное число, чтобы сравнить изменение потенциала следующим образом. Если случайное число больше экспоненты изменения потенциала, то создайте новую ячейку, иначе отмените.

Теоретически, сфера будет расти вокруг семени. Однако в моем эксперименте форма кластера нерегулярна. Прилагаемое изображение представляет собой кластер из 50000 ячеек. Может ли кто-нибудь дать мне несколько комментариев. Связано ли это с генерацией случайного числа? Благодарю.

a cluster created around a seed with random number

XY plane of cluster

XZ plane of cluster

Interplate in process 3

+0

Это может быть глупый вопрос, но почему вы думаете, что форма, которую вы опубликовали, «нерегулярна»? Кажется, что центр вашей колонии клеток составляет 260 260 60, а колония клеток примерно распространяется примерно на 230..290 в направлении x/y/z. Это в значительной степени сфера? –

+0

Вы правы. Диапазон кластера выглядит правильно. Но форма огибающей кластера не является кругом. Вы можете видеть из плоскости xy и xz кластера. Поверхность кластера негладкая. Я создал 50000 ячеек. – HXGuo

+0

У вас есть причина не использовать многомерный массив? например 'А [х] [у] [г]'. Это улучшит читаемость вашего кода и уменьшит вероятность ошибок с нашими индексами. – Richard

ответ

2

У меня есть две мысли относительно этого.

Первый: прямолинейная сетка, которую вы используете, представляет собой трудность. То есть, не глядя слишком глубоко на ваш код, рост вдоль оси x, y- или z, вероятно, будет происходить с другой скоростью, чем рост вдоль диагональной оси.

Эта проблема трудно обойти. Если вы разрешаете подключение d-26 (центральная ячейка соединяется с кубом всех ячеек вокруг нее), то как вы определяете (немного) большее расстояние до диагональных ячеек? Если вы разрешаете рост только по х-, у- и z-осям, как вы объясняете тот факт, что ячейка в диагональном направлении занимает больше времени, чем нужно?

Это может объяснять некоторые из нечеткости.

Второй: Прямо сейчас мы используем метрику «это выглядит скачками». Но это действительно? Нам нужно хорошее статистическое испытание того, насколько нерегулярно оно по сравнению с нерегулярным, что мы ожидаем от него. Конечно, это так, что вы не ожидали бы, что край вашего блоба будет полностью сферическим, поскольку это, в конце концов, случайный процесс.