Etkileşimli görüntü bölümlemesi için bir "akıllı makas" kullanmaya çalışıyorum. Bu nedenle, her köşe noktasının tek bir pikseli temsil ettiği bir görüntüden yönlendirilmiş bir grafik oluşturmak zorundayım. Her köşe daha sonra komşularının her birine iki kenardan girer: bir giden ve bir gelen kenar. Bunun nedeni, bir kenarın (a, b) maliyetinin (b, a) maliyetinden farklı olabilmesidir. 512 * 512 piksel boyutunda görüntüler kullanıyorum, böylece 262144 köşesi ve 2091012 kenarları ile bir grafik oluşturmam gerekiyor.Yükseltme Grafik Kitaplığı: Büyük grafikler için kenar ekleme yavaş çalışıyor
typedef property<vertex_index_t, int,
property<vertex_distance_t, double,
property<x_t, int,
property<y_t, int
>>>> VertexProperty;
typedef property<edge_weight_t, double> EdgeProperty;
// define MyGraph
typedef adjacency_list<
vecS, // container used for the out-edges (list)
vecS, // container used for the vertices (vector)
directedS, // directed edges (not sure if this is the right choice for incidenceGraph)
VertexProperty,
EdgeProperty
> MyGraph;
I Grafik (yavan adlandırma müteessir), ek bir sınıfı kullanıyorum grafik işleme: Şu anda, aşağıdaki grafik kullanıyorum
class Graph
{
private:
MyGraph *graph;
property_map<MyGraph, vertex_index_t>::type indexmap;
property_map<MyGraph, vertex_distance_t>::type distancemap;
property_map<MyGraph, edge_weight_t>::type weightmap;
property_map<MyGraph, x_t>::type xmap;
property_map<MyGraph, y_t>::type ymap;
std::vector<MyGraph::vertex_descriptor> predecessors;
public:
Graph();
~Graph();
};
262144 köşesiyle yeni bir grafik oluşturmak oldukça hızlıdır, ancak kenarların yerleştirilmesi 10 saniyeye kadar çıkar ve bu da istenen uygulama için çok yavaştır. Ben programm hızını artırmak do yapabileceğim bir şey
tie(vertexIt, vertexEnd) = vertices(*graph);
for(; vertexIt != vertexEnd; vertexIt++){
vertexID = *vertexIt;
x = vertexID % 512;
y = (vertexID - x)/512;
xmap[vertexID] = x;
ymap[vertexID] = y;
if(y > 0){
if(x > 0){
tie(edgeID, ok) = add_edge(vertexID, indexmap[IRES2D*(y-1)+(x-1)], *graph); // upper left neighbour
}
tie(edgeID, ok) = add_edge(vertexID, indexmap[IRES2D*(y-1)+(x)], *graph); // upper
if(x < 511){
tie(edgeID, ok) = add_edge(vertexID, indexmap[IRES2D*(y-1)+(x+1)], *graph); // upper right
}
}
if(x < 511){
tie(edgeID, ok) = add_edge(vertexID, indexmap[IRES2D*(y)+(x+1)], *graph); // right
}
if(y < 511){
if(x > 0){
tie(edgeID, ok) = add_edge(vertexID, indexmap[IRES2D*(y+1)+(x-1)], *graph); // lower left
}
tie(edgeID, ok) = add_edge(vertexID, indexmap[IRES2D*(y+1)+(x)], *graph); // lower
if(x < 511){
tie(edgeID, ok) = add_edge(vertexID, indexmap[IRES2D*(y+1)+(x+1)], *graph); // lower right
}
}
if(x > 0){
tie(edgeID, ok) = add_edge(vertexID, indexmap[IRES2D*(y)+(x-1)], *graph); // left
}
}
var mı: Şu anda, aşağıdaki yolu kenarları takacağım? Microsoft Visual C++ 2010 Express'i optimizasyon ile (Boost tarafından tavsiye edildiği şekilde) serbest bırakma modunda kullanıyorum. Köşeler veya kenarlar için listS kapsayıcıyı kullanabileceğimi düşündüm ama köşeler sorun değil ve kenarlar için listeS kullanırsanız, daha da yavaşlar.
Çok teşekkürler. Sanırım, ikinci önerinizde belirtildiği gibi grafiğin kendi temsilini gerçekleştireceğim. Oldukça küçük bir görüntü ile başladım ve problemin daha iyi bir görünümünü elde etmek için her bir düğüm ve kenarı tahsis ettim. Umarım bu grafiği BGL kullanarak biraz zaman kazanabilirim ama aslında BGL'ye herşeyi uydurmakla neredeyse 3 gün harcadım ... Tekrar teşekkürler. – Netztroll
Çalışan bir bitişik_listeye dayalı uygulamaya sahip olmak, en azından uyguladığınız alternatif BGL uyumlu yedek grafik temsilini kolayca test edebilecek bir sisteminiz olduğu anlamına gelmelidir. – timday
Ayrıca, BGL'nin @günday'ın atıfta bulunduğu en uygun gösterim olan 'grid_graph'ı da görmek isteyebilirsiniz. –