【问题标题】:Mapping one type to another to use with own algorithm将一种类型映射到另一种类型以使用自己的算法
【发布时间】:2017-03-28 14:29:32
【问题描述】:

我目前正在开发一个执行一些计算几何的库。为了可视化我的算法结果(并在交互式环境中使用它们),我决定在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&lt;rectangle*,QGraphicsRectItem*&gt; 来跟踪它们属于哪个项目。处理完rectangles 后,我可以遍历向量并将更改应用于场景中的项目。

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

【问题讨论】:

  • layout 只是改变值,还是移动矩形索引?

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


【解决方案1】:

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

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

做布局。

反转向量。

遍历场景,从每个场景元素的向量末端弹出新位置。

你可能会弄乱指针或索引,但上面的代码可以作为一次性队列并且可以工作。

你从场景开始:

qA qB qC qD qE qF qG

然后我们创建一个矩形向量:

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]

等等

【讨论】:

  • 感谢您的回答。不幸的是,并非所有算法都是稳定的。我应该从一开始就提到这一点。
  • @j.dog 那么您的问题无法按描述解决:指向向量中元素的指针也不稳定。增强您的布局功能以跟踪身份。
  • 当然,现在我觉得自己很愚蠢。感谢您指出这一点。
猜你喜欢
  • 2021-04-11
  • 2011-05-30
  • 1970-01-01
  • 2015-08-12
  • 2021-04-18
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多