bool TechTreeLayout::Node::Wobble(Column& column) { double dist, new_dist, s_dist, new_s_dist; dist = CalculateFamilyDistance(m_row); //try to find free space arround optimal position int closest_free_index = column.ClosestFreeIndex(static_cast<int>(m_row + dist + 0.5), this); //check if that space is better new_dist = CalculateFamilyDistance(closest_free_index); double improvement = std::abs(dist) - std::abs(new_dist); if (improvement > 0.25) { if (column.Move(closest_free_index , this)) { //std::cout << m_name << ":" << dist << " -> " << new_dist <<"\n"; return true; } } // no free space found, but might be able to swap positions with another node // find neighbour int direction = (dist > 0) ? 1 : -1; Node* n = column.Seek(this, direction); // try to switch node with neighbour node if (n != 0) { s_dist = n->CalculateFamilyDistance(n->m_row); new_s_dist = n->CalculateFamilyDistance( m_row); new_dist = CalculateFamilyDistance(n->m_row); improvement = std::abs(dist) + std::abs(s_dist) - std::abs(new_dist) - std::abs(new_s_dist); if (improvement > 0.25) { // 0 produces endless loop if (column.Swap(this, n)) { //std::cout << "(S)" << m_name << ":" << dist << " -> " << new_dist << " & "<< n->m_name << ":" << s_dist << " -> " << new_s_dist << "\n"; return true; } } } return false; }