Алгоритм макета для элементов, подключенных через портыC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Алгоритм макета для элементов, подключенных через порты

Сообщение Anonymous »

Я реализую графический редактор, отображающий элементы (прямоугольники) с портами с левой и правой стороны. Эти порты могут быть подключены к портам других элементов (порт ввода в порт вывода и наоборот). < /P>
Все это работает хорошо, но теперь я ищу способ сделать автоматический макет этих элементов. Я попробовал Boost :: Графическая библиотека (алгоритм макета, направленный силой), но алгоритм на самом деле не приспособлен к тому, что мне нужно, и результаты, к сожалению, не велики. Я добавляю все элементы в качестве вершин и уменьшал соединения с одним соединением между двумя конкретными элементами (так что игнорируя несколько соединений между двумя теми же элементами). Вот что я попробовал до сих пор (упрощено, удалив код, очищая несколько соединений, потому что в любом случае результат одинаково): < /p>
typedef boost::adjacency_list
Graph;

auto elements = m_graphCtrl->GetElements();
typedef boost::graph_traits::vertex_descriptor Vertex;
typedef std::map NameToVertex;
NameToVertex nameToVertexMap;

Graph boostGraph;
// Add the vertices: 1 element corresponds to 1 vertex
for (const auto& elm : elements) {
std::wstring name = elm->GetUuid();
nameToVertexMap[name] = boost::add_vertex(name, boostGraph);;
}

// Add the edges
auto connections = m_graphCtrl->GetConnections();
for (const auto& connection : connections) {
std::wstring name1 = connection->GetSourcePort()->GetParentElement()->GetUuid();
std::wstring name2 = connection->GetDestinationPort()->GetParentElement()->GetUuid();
boost::add_edge(nameToVertexMap[name1], nameToVertexMap[name2], boostGraph);
}

// Invoke the fruchterman_reingold_force_directed_layout function
typedef boost::rectangle_topology topology_type;
typedef std::vector PositionVec;
PositionVec position_vec(elements.size());
typedef boost::iterator_property_map
PositionMap;
PositionMap position(position_vec.begin(), get(boost::vertex_index, boostGraph));
boost::minstd_rand gen;
topology_type topo(gen, 0, 0, 750, 500);

random_graph_layout(boostGraph, position, topo);
boost::fruchterman_reingold_force_directed_layout(
boostGraph, position, topo, cooling(boost::linear_cooling(100)));

// Position the elements according to the algo output
boost::graph_traits::vertex_iterator vi, vi_end;
for (boost::tie(vi, vi_end) = boost::vertices(boostGraph); vi != vi_end; ++vi) {
auto name = get(boost::vertex_name, boostGraph, *vi);
m_graphCtrl->GetElement(name.c_str())->SetPosition(position[*vi][0], position[*vi][1]);
}
< /code>
m_graphctrl - это мой собственный контроль, который заботится о чертеже соединений и элементов. Элементы и соединения добавляются где -то в другом месте, я просто пытаюсь аккуратно передать все элементы здесь. Алгоритм не учитывает «естественный поток» элементов на основе соединений. Я ищу алгоритм, который будет более естественным образом расположить элементы, аналогично этим: (я перенес их вручную здесь)

al -your your your your your your you al your your your you al your your your your your as your your your your your your your your your is your is your your your is your is your is your is your your your is your as your as yourse lith. Здесь, чтобы реализовать это?

Подробнее здесь: https://stackoverflow.com/questions/797 ... ough-ports
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»