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

标签 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 中使用这个算法在现场。你会怎么做?我在想我可以转换 QGraphicsItemsrectangles ,将矩形存储在 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/

相关文章:

qt - 样式的别名

c++ - 如何使用 OpenCV 或其他图像处理库从 RGB 数据写入 YUV 420 视频帧?

C++ makefile 未创建必要的 .o 文件

c++ - 将 Eclipse 生成的 makefile 保留在版本控制中 - 会出现什么问题吗?

algorithm - 如何计算出 2048 游戏的复杂性?

C++ - 可以跟踪结构(x 和 y)和值以避免重复的数据结构/算法

c++ - 任何用于 C++ 的跨平台视频播放库?

c++ - 在 QT 中按一下鼠标即可控制多个 QGraphicsItem

java - 为什么选择 31 在 hashcode() 实现中进行乘法运算?

c++ - Qt - 登录对话框