QRegion in QGraphicsItem konvertieren(oder vergleichbares)
Verfasst: 3. Juli 2009 09:39
Hallo,
ich habe ein (größeres) Problem mit meiner GraphicsView/GraphicsScene.
Und zwar ist es so, dass der Aufbau der View und die resize-Aktionen sehr sehr lange dauern.
Der Tipp, der mir gegeben wurde : myView->setViewpor(new QGLWidget()); kann ich nicht umsetzen, da ich eine kommerzielle Lizenz habe, die sich nur auf die GUI beschränkt. Demzufolge kann ich QGLWidget nicht benutzen.
Da ich in meiner Scene ein Koordinatensystem mit im Schnitt einer Million Punkte darstellen möchte, ist die View sehr sehr langsam.
Ich hatte die Idee, dass ich die Punkte, die sich überschneiden oder berühren zusammenfasse zu einem Polygon.
wie man unschwer erkennen kann, dauert das eingeben von punkten ewig lange, ständig polygone vereinigt und in der liste die replace-vorgänge stattfinden. nachdem die schleife abgearbeitet ist, gefühlte 2 jahre später, dauert der aufbau der view sehr sehr lange....
ich denke wenn anstatt QPolygonF man QRegion benutzen würde, wäre es um einiges schneller, sowohl das eingeben von punkten als auch der aufbau der viel, weil es dann erheblich weniger items gäbe in der scene.
Leider hab ich keine weg gefunden, um QRegion in QGraphicsItem umzuwandeln, damit es dann in die Scene eingefügt werden kann.
Fall jemand weiß wie es geht oder einen anderen konstruktiven Vorschlag zur optimierung hat, wäre ich sehr dankbar.
ich habe ein (größeres) Problem mit meiner GraphicsView/GraphicsScene.
Und zwar ist es so, dass der Aufbau der View und die resize-Aktionen sehr sehr lange dauern.
Der Tipp, der mir gegeben wurde : myView->setViewpor(new QGLWidget()); kann ich nicht umsetzen, da ich eine kommerzielle Lizenz habe, die sich nur auf die GUI beschränkt. Demzufolge kann ich QGLWidget nicht benutzen.
Da ich in meiner Scene ein Koordinatensystem mit im Schnitt einer Million Punkte darstellen möchte, ist die View sehr sehr langsam.
Ich hatte die Idee, dass ich die Punkte, die sich überschneiden oder berühren zusammenfasse zu einem Polygon.
Code: Alles auswählen
QList <QPolygonF*> list;
for(long int i = 0;i<1000000;i++)
{
//zufällig ausgewählte punkte zu testzwecken
x1 = rand()*y1;
y1 = rand()*x1;
if(x1<1500)
x1 = 1500 + ((rand()*y1)%1000);
else x1 = x1 % 2500;
if(y1<1500)
y1 = 1500 + ((rand()*x1)%1000);
else y1 = y1 % 2500;
//der neue punkt
QPolygonF newPoint(QRectF(x1,y1,3,3));
//case 1: QGraphicsItemGroup* ist leer;
if(list.isEmpty())
{
QPolygonF * g = new QPolygonF(newPoint);
list.append(g);
}
//case 2:liste nicht leer
else
{
//bestimme ob polygon anere polygone schneidet und //somit mit einem anderen Polygon vereinigt werden kann
int g = 0;
bool intersects = false;
while(g<list.size() && !intersects)
{
if(list.at(g)->boundingRect().intersects(newPoint.boundingRect()))
{
intersects = true;
QPolygonF * re = new QPolygonF(list.at(g)->united(newPoint));
list.replace(g,re);
}
g++;
}
//falls es kein polygon in der liste schneidet
if(!intersects)
{
QPolygonF * g = new QPolygonF(newPoint);
list.append(g);
}
}
}
//jetzt polygone in die scene einfügen
while(!list.isEmpty())
{
myScene->addPolygon(*list.at(0));
list.removeAt(0);
}
ich denke wenn anstatt QPolygonF man QRegion benutzen würde, wäre es um einiges schneller, sowohl das eingeben von punkten als auch der aufbau der viel, weil es dann erheblich weniger items gäbe in der scene.
Leider hab ich keine weg gefunden, um QRegion in QGraphicsItem umzuwandeln, damit es dann in die Scene eingefügt werden kann.
Fall jemand weiß wie es geht oder einen anderen konstruktiven Vorschlag zur optimierung hat, wäre ich sehr dankbar.