Diskuze: Komponenta pro vykreslení "diagramu"

C# .NET .NET (C# a Visual Basic) Komponenta pro vykreslení "diagramu" American English version English version

Avatar
layosh1
Člen
Avatar
layosh1:

Ahojte,
potřeboval bych poradit, třeba s tím máte někdo zkušenost - zkusím nastínit jednoduše problém. Potřebuju vizualizovat "diagram" v ploše 65536 x 65536 bodů. Každý objekt bude mít vlastní souřadnice, kde v této síti leží,zároveň budou moci být libovolné dva objekty spojeny - vizualizovalo by se to jako čára spojující tyto dva objekty. Budu chtít vykreslovat jen určitou část této plochy, která je viditelná z různých úrovní přiblížení. Problém je, že těch objektů a jejich spojnic můžou být řádově desítky tisíc. Obávám se, pokud to budu dělat ve vlastní režii, bude to pomalé a neohrabané. Nemáte nějaké ověřené řešení - tip na komponentu, která by to zvládla?
Díky

 
Odpovědět 6.1.2014 23:02
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na layosh1
Jan Vargovský:

No klasický graphics bych nato nepoužíval. Použil bych D3D. Objekty můžeš uchovávat asi normálně v nějaké kolekci, držet pozici, velikost a nějakou zoom konstantu, která se bude měnit.

Uchovávat celou bitmapu ... Nato .NET nevystačí s op. pamětí, takže bys i vždycky připravil bitmapu, která by reprezentovala to místo, na které se aktuálně díváš a ptal se všech objektů, zda jsou viditelná, když je vynásobíš tou zoom konstantou. Pak bys je jednoduše vykreslil.

Btw 65536(šířka) * 65536(výška) * 32(barva) = ... = 16777216KB = 16384 MB = 1,6GB ... Při tom, že .NET VM povoluje max 2GB.

Editováno 6.1.2014 23:15
 
Nahoru Odpovědět 6.1.2014 23:14
Avatar
layosh1
Člen
Avatar
Odpovídá na Jan Vargovský
layosh1:

Ještě jsem zapomněl dodat, že by se mělo jednat o WPF aplikaci. Uchovával bych to v kolekci a jak píšeš pozice a zoom by se měnily.
Mohlo by to být vizuálně něco podobného jako na tomto obrázku:
http://www.genopro.com/…arriages.png

 
Nahoru Odpovědět 6.1.2014 23:21
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na layosh1
Jan Vargovský:

Jen teoreticky ... Proč být omezený velikostí ? Takové rozlišení stejně nikdy nerozbrazíš, byl bys rád v dnešní době za 4k, což je myslím už tak dost. Jsou to jednoduché objekty, takže by to neměl být problém. Omezil bych se maximálně na zoom a pak si vlastně omezený dost. Kdyžtak se ti můžu poptat, kámoš vykresloval 3D grafy pomocí D3D a zvládal vpohodě osy, které měly interval <-109; 109>. Sice to byly jen jednoduché čáry, ale to je v tvém případě taky.

No ve WPFku začínám, takže nevím čeho je schopno a jestli by to zvládlo, ale vzhledem k tomu, že to akceleruje grafika, tak by mohlo :)

Editováno 6.1.2014 23:28
 
Nahoru Odpovědět 6.1.2014 23:27
Avatar
Odpovídá na layosh1
Luboš Běhounek (Satik):

Vykresluj jen ten výřez, co potřebuješ vidět, a stačí ti pár MB, je zbytečné zabírat 16 GB paměti, a mít tam uložený celý obrázek.

Nahoru Odpovědět 7.1.2014 0:48
:)
Avatar
Kit
Redaktor
Avatar
Nahoru Odpovědět 7.1.2014 3:29
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
layosh1
Člen
Avatar
Odpovídá na Kit
layosh1:

Tak to by bylo krásný, ještě to mít jako komponentu použitelnou ve WPF aplikaci. To jsem na tom webu nenašel...

 
Nahoru Odpovědět 7.1.2014 9:46
Avatar
layosh1
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
layosh1:

Myslím, že není potřeba připravovat si celý obraz, stačil by mi výřez např. 20x20 bodu z té plochy. Jde mi ale o to, že než otestuju viditelnost v té ploše třeba 20000 objektů, tak pokud to budu dělat ve vlastní režii, mám strach, že to bude pomalé, proto se ptám na zkušenosti s něčím podobným...

 
Nahoru Odpovědět 7.1.2014 9:49
Avatar
Odpovídá na layosh1
Luboš Běhounek (Satik):

Spočítat viditelnost 20 000 objektů je naprosto v pohodě.

  • případné urychlení jak píše coells - třeba quadtree - rozdělíš si prostor na menší čtverce a každý bude u sebe obsahovat, které objekty na něm jsou.
Nahoru Odpovědět 7.1.2014 13:43
:)
Avatar
layosh1
Člen
Avatar
layosh1:

Díky za rady, zkusil jsem si udělat pár pokusů, skutečně testovat viditelnost 100000 objektů v kolekci je v pohodě. Dělit není třeba na menší oblasti.
Uvažoval jsem, že bych použil komponentu odvozenou od ScrollView, které bych nastavil onu plochu 65536 x 65536 bodu a na ní vykreslil jen ty objekty diagramu, které jsou viditelné.
Dalo by se to využít takovým způsobem? A nebo uvažuju úplně špatně a je třeba si na to napsat od píky vlastní UserControl?

 
Nahoru Odpovědět 13.1.2014 23:33
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na layosh1
Jan Vargovský:

Nevím jak funguje ScrollView, ale je zbytečné uchovávat v paměti takové množství dat. Vždyť jsme ti i řekli, kolik by to zabíralo paměti...

 
Nahoru Odpovědět 14.1.2014 0:00
Avatar
layosh1
Člen
Avatar
Odpovídá na Jan Vargovský
layosh1:

Asi jsem to špatně napsal - nepotřebuju uchovávat v paměti vše jako bitmapu. potřebuju jen plochu, kde bude umístěno řádově desítky tisíc objektů, nad výřezem plochy se budu pohybovat a chtěl bych dynamicky zobrazit jen řádově desítky, možná stovky objektů (komponent), které jsou vidět.

 
Nahoru Odpovědět 14.1.2014 12:36
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.