Информация об изменениях

Сообщение Re[5]: Перевод понимания из интуиции в логику от 21.11.2020 14:49

Изменено 21.11.2020 15:28 xma

Re[5]: Перевод понимания из интуиции в логику
Здравствуйте, Khimik, Вы писали:

K>Я честно говоря не понял, что вы имеете в виду под сотами? На второй картинке видно, что возможны смежные циклы — один атом входит в несколько циклов.


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

у тебя на картинке — просто в каждом цикле есть атомы, которые не входят в другие циклы .. я это обыграл в решении ..

K>>>Надо было ещё пояснить как создаётся массив соседей атомов.


K>Исходные данные — два массива: в первом перечислены атомы — тип атома и координаты x,y,z. Во втором перечислены связи — номера двух атомов которые друг с другом связаны.

K>Нужно создать для каждого атома динамический массив — атомы, связанные с ним, пробежаться циклом по связям и добавлять в эти динамические массивы соседние атомы для каждого атома.

ну если это "не игра скорость", то

  Скрытый текст
// считаем что все атомы связаны хотя бы через один другой друг с другом
// топорный метод, но тебе вроде скорость профиг  :))

struct atom {
 int x,y,z;
 //vector <struct atom *> neighborhoods; // links
 ector <int> neighborhoods_indices; 
};

vector <atom> atoms;

atoms.resize ( source_atoms_array.size() );

for (int i=0; i<source_atoms_array.size(); ++i) {
    atoms[i].xyz = source_atoms_array[i].xyz; // условный код
}

bool have_neighborhood_link( const int atom_index, const int neighborhood_index ) {
   for (int i=0; i<atoms[atom_index].neighborhoods_indices.size(); ++i) {
      if ( neighborhood_index == atoms[atom_index].neighborhoods_indices[i] ) return true;
   }

   return false;
};

// сначала надо нафигачить линки (индексы) - на соседние атомы, в каждый атом массива atoms
for (int i=0; i<atom_links; ++i) {
   if (false == have_neighborhood_link ( atom_links[i].index0, atom_links[i].index1 ) ) {
      atoms[atom_links[i].index0].neighborhoods_indices.push_back( atom_links[i].index1); 
   }

   if (false == have_neighborhood_link ( atom_links[i].index1, atom_links[i].index0 ) ) {
      atoms[atom_links[i].index1].neighborhoods_indices.push_back( atom_links[i].index0); 
   }
}

// ну а далее по сути имеем готовый "список" (точнее граф) через индексы соседей (в массиве atoms), можно по нему бегать - а можно развернуть через прямые ссылки (указпатели) на список граф, начиная с любого элемента (назовём его первым) ..
Re[5]: Перевод понимания из интуиции в логику
Здравствуйте, Khimik, Вы писали:

K>Я честно говоря не понял, что вы имеете в виду под сотами? На второй картинке видно, что возможны смежные циклы — один атом входит в несколько циклов.


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

у тебя на картинке — просто в каждом цикле есть атомы, которые не входят в другие циклы .. я это обыграл в решении ..

K>>>Надо было ещё пояснить как создаётся массив соседей атомов.


K>Исходные данные — два массива: в первом перечислены атомы — тип атома и координаты x,y,z. Во втором перечислены связи — номера двух атомов которые друг с другом связаны.

K>Нужно создать для каждого атома динамический массив — атомы, связанные с ним, пробежаться циклом по связям и добавлять в эти динамические массивы соседние атомы для каждого атома.

ну если это "не игра на скорость", то

  Скрытый текст
// считаем что все атомы связаны хотя бы через один другой друг с другом
// топорный метод, но тебе вроде скорость профиг  :))

struct atom {
 int x,y,z;
 //vector <struct atom *> neighborhoods; // links
 ector <int> neighborhoods_indices; 
};

vector <atom> atoms;

atoms.resize ( source_atoms_array.size() );

for (int i=0; i<source_atoms_array.size(); ++i) {
    atoms[i].xyz = source_atoms_array[i].xyz; // условный код
}

bool have_neighborhood_link( const int atom_index, const int neighborhood_index ) {
   for (int i=0; i<atoms[atom_index].neighborhoods_indices.size(); ++i) {
      if ( neighborhood_index == atoms[atom_index].neighborhoods_indices[i] ) return true;
   }

   return false;
};

// сначала надо нафигачить линки (индексы) - на соседние атомы, в каждый атом массива atoms
for (int i=0; i<atom_links; ++i) {
   if (false == have_neighborhood_link ( atom_links[i].index0, atom_links[i].index1 ) ) {
      atoms[atom_links[i].index0].neighborhoods_indices.push_back( atom_links[i].index1); 
   }

   if (false == have_neighborhood_link ( atom_links[i].index1, atom_links[i].index0 ) ) {
      atoms[atom_links[i].index1].neighborhoods_indices.push_back( atom_links[i].index0); 
   }
}

// ну а далее по сути имеем готовый "список" (точнее граф) через индексы соседей (в массиве atoms), можно по нему бегать - а можно развернуть через прямые ссылки (указпатели) на список граф, начиная с любого элемента (назовём его первым) ..