我目前正在开发一个可以计算几何的库。为了可视化我的算法的结果(并在交互式设置中使用它们),我决定在 Qt
中编写一个小的查看器/工具。 ,但将核心逻辑与此查看器分开。所以现在我有一个 QGraphicsScene
其中包含一堆不同的项目,但是,我只对 QGraphicsRectItems
感兴趣:
for(auto* item : scene) {
if(QGraphicsRectItem* c = qgraphicsitem_cast<QGraphicsRectItem*>(item)) {
// ... do stuff
}
}
我的库目前定义了我自己的类型
struct rectangle {
double x,y;
double w,h;
};
以及适用于它们的算法。假设我有一个方法
void layout(std::vector<rectangle>& rs) { ... }
它采用任意位置的集合 rectangles
并将它们并排放置。
我现在想在我的 QGraphicsRectItems
中使用这个算法在现场。你会怎么做?我在想我可以转换 QGraphicsItems
至 rectangles
,将矩形存储在 vector 中并使用 std::unordered_map<rectangle*,QGraphicsRectItem*>
跟踪它们属于哪个项目。在我完成处理后 rectangles
我可以遍历 vector 并将更改应用到场景中的项目。
这是要走的路吗?你会如何解决这个问题?也许我的设计从一开始就有缺陷?
最佳答案
如果场景具有稳定的排序,并且布局编辑条目而不“重新排序”它们,则迭代场景。
使用回推将场景中的每个元素的矩形填充到 vector 中。
做布局。
反转 vector 。
遍历场景,为每个场景元素弹出 vector 末尾的新位置。
您可能会弄乱指针或索引,但上面的内容充当单 channel 队列并且可以正常工作。
您从具有以下场景的场景开始:
qA qB qC qD qE qF qG
然后我们创建一个矩形 vector :
rA rB rC rD rE rF rG
我们将它们处理为小写:
ra rb rc rd re rf rg
然后反转:
rg rf re rd rc rb ra
现在我们遍历 qt scene 和 pop:
current | stack [top of stack]
qA:ra | rg rf re rd rc rb [ra]
qB:rb | rg rf re rd rc [rb]
qC:rc | rg rf re rd [rc]
等等
关于c++ - 将一种类型映射到另一种类型以使用自己的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40597444/