Jak vykreslit jeden pixel?   zodpovězená otázka

Algoritmy, WinForms, .NET

Zdravím,

jak lze v (VB.NET 2010) vykreslit jeden pixel na formulář?

Chtěl bych napsat vizualizaci dynamického systému Martin ale zasekl jsem se u toho jak vykreslit jeden pixel. Do okna(formuláře) který má styl na none.

Potřeboval bych něco jako:

private sub Vykreslit(byval S as object, byval e as PaintEventArgs) handles me.paint
e.graphics.pixel(X-souřadnice, Y-souřadnice, Barva)
end sub

Pokud ovšem taková metoda existuje. Jinak těch pixelů budu vykreslovat víc. Tak jsem se ještě chtěl zeptat jestli na to není vhodné použít například DirectX?

Předem díky.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

K tomu můžete použít e.Graphics.FillRectangle(brush, x, y, 1, 1). Záleží na složitosti toho co chcete vykreslovat, ale předpokládám, že to nebude nic co by nezvládlo GDI+. Používat DirectX pro jednoduché věci je neefektivní z hlediska náročnosti vývoje.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Výsledkem mého snažení má být tohle :

http://i.iinfo.cz/urs/fractals06_2-previ...

Na náročnost vykreslení mi to nepříjde složité ale já do hloubky nevidím.

Jinak to byl fofr jak rychle jste mi odpověděl.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Tak tohle bych rozhodně nevykresloval pomocí jednotlivých pixelů.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jak tedy?

Toto je funkce kterou vytvářím pixely Vámi popsaným způsobem. Dynamický systém vrací proměnou X a Y, to se přímo nabízí vykreslování pomocí pixelů :D

    Private Function Martin(ByVal X As Double, ByVal Y As Double, ByVal A As Double, ByVal Zvetseni As Double, ByVal PosunX As Integer, ByVal PosunY As Integer, ByVal Iter As Integer) As Rectangle()
        Dim X2 As Double
        Dim Body(Iter) As Rectangle
       
        While Iter > 0
            Iter -= 1
            X2 = X
            X = Y - Sin(X)
            Y = A - X2
            Body(Iter) = New Rectangle(CInt(X * Zvetseni + PosunX), CInt(Y * Zvetseni + PosunY), 1, 1)
        End While
        Return Body
    End Function

Jinak tohle pracuje velice pomalu. Pro pěkný obrázek potřebuju cca 590000 iterací. A to je sakra hodně bodů!

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Pokud to potřebujete vykreslovat pomocí jednotlivých pixelů, tak si z bitmapy vytáhněte pole bajtů a pracujte s ním, bude to řádově rychlejší.

http://msdn.microsoft.com/en-us/library/...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to vypadá dobře. Jen jak převedu souřadníce X a Y do indexu pole?(něco mi říká že X * Y stačit nebude)

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Zkute objekt image a getpixel a setpixel. Výsledek pak vykreslete. Je to pomalejší, ale jednoduší.

nahlásit spamnahlásit spam -3 / 3 odpovědětodpovědět

x + y * šírka(width) obrázku

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky za odpověď už jsem na to přišel sám. Ale ten váš vzorec je špatně!

Je to: (y * šířka * 3)+(x*3)

Každý pixel je reprezentován třemi indexi v poli(třemi hodnotami).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Áno, *3 keď ide o pole bajtov 24bit obrázka.Môj vzorec je platný pre index pixelu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback