将一种类型映射到另一种类型以使用自己的算法

时间:2016-11-14 20:39:35

标签: c++ algorithm qt c++14

我目前正在开发一个执行某些计算几何的库。为了可视化我的算法的结果(并在交互式设置中使用它们),我决定在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,将矩形存储在矢量中并使用std::unordered_map<rectangle*,QGraphicsRectItem*>来跟踪它们属于哪个项目。完成处理后rectangles我可以迭代向量并将更改应用于场景中的项目。

这是要走的路吗?你会如何解决这个问题?也许我的设计从一开始就存在缺陷?

1 个答案:

答案 0 :(得分:1)

如果场景具有稳定的排序,并且布局编辑条目而不“重新排序”它们,则迭代场景。

使用回推为场景中的每个元素将一个矩形填充到矢量中。

做布局。

反转矢量。

迭代场景,在每个场景元素的矢量末尾弹出新位置。

你可能会搞乱指针或索引,但上面的行为是一次通过队列并起作用。

你从场景开始:

qA qB qC qD qE qF qG

然后我们创建一个rects矢量:

rA rB rC rD rE rF rG

我们将它们处理为小写:

ra rb rc rd re rf rg

然后反转:

rg rf re rd rc rb ra

现在我们遍历qt场景并弹出:

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]