Я реализую графический редактор, отображающий элементы (прямоугольники) с портами с левой и правой стороны. Эти порты могут быть подключены к портам других элементов (порт ввода в порт вывода и наоборот). < /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
Алгоритм макета для элементов, подключенных через порты ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1758203173
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. Здесь, чтобы реализовать это?
Подробнее здесь: [url]https://stackoverflow.com/questions/79768528/layout-algorithm-for-elements-connected-through-ports[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия