2016-11-14 6 views
1

現在、いくつかの計算幾何学を行うライブラリを作成中です。私のアルゴリズムの結果を視覚化するために(そしてそれらをインタラクティブな設定で使用するために)、小さなビューア/ツールをQtに書き込むことに決めましたが、このビューアからコアロジックを分離したままにしておきます。だから今、私はさまざまなアイテムの束を含むQGraphicsScene、しかし、私はQGraphicsRectItemsで唯一興味を持っています独自のアルゴリズムで使用するためにある型を他の型にマッピングする

for(auto* item : scene) { 
    if(QGraphicsRectItem* c = qgraphicsitem_cast<QGraphicsRectItem*>(item)) { 
     // ... do stuff 
    } 
} 

マイライブラリは現在、自分のタイプ

struct rectangle { 
    double x,y; 
    double w,h; 
}; 

と上で動作するアルゴリズムを定義しますそれら。私はarbitrarly位置付けrectanglesのコレクションを取り、お互いの隣にそれらすべてを配置する方法を

void layout(std::vector<rectangle>& rs) { ... } 

持って想像してみてください。

このアルゴリズムをシーン内のQGraphicsRectItemsで使用したいと考えています。あなたはどうしますか? QGraphicsItemsrectanglesに変換し、ベクトルに長方形を格納し、std::unordered_map<rectangle*,QGraphicsRectItem*>を使用して、どのアイテムに属しているかを記録しておくことを考えました。私が処理を終えた後、rectangles私はベクトルを反復してシーンのアイテムに変更を適用することができました。

これは方法ですか?どのようにこの問題を解決しますか?多分私のデザインは最初から欠陥がありますか?

+0

'ただ値を変更layout'ない、またはそれは長方形の指数を動き回るのですか? – Yakk

答えて

1

シーンの順序が安定していて、レイアウトが「並べ替え」せずにエントリを編集した場合は、シーンを繰り返し処理します。

プッシュバックを使用して、シーン内の各要素のベクトルに矩形を入れます。

レイアウトを実行します。

ベクトルを反転させます。

シーン全体を繰り返し、各シーン要素のベクトルの最後から新しい位置をポップします。

ポインタやインデックスを混乱させる可能性がありますが、上記は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] 

など

+0

あなたの答えをありがとう。残念ながら、すべてのアルゴリズムが安定しているわけではありません。私は最初からそれを言及していたはずです。 – fuji

+1

@ j.dogあなたの問題は、記述されているように解決できません:ベクトルの要素へのポインタも安定していません。アイデンティティを追跡するためにレイアウト関数を拡張します。 – Yakk

+0

もちろん、今私は愚かだと感じる。これを指摘していただきありがとうございます。 – fuji

関連する問題