Jump to content
Sign in to follow this  
TobiPL

Ustawianie koloru piksela

Recommended Posts

W odpowiedzi na ten temat:

 

SetPixel jest powolny jednak istnieją dużo lepsze metody które pozwalają ci uzyskać nawet dużą wydajność...

Mało tego zobacz ten kanał na YT:

https://www.youtube.com/watch?v=LPzyNOHY3A4

 

Aby mieć możliwość szybkiego renderowania tak jak chciałeś np. z tylko WinApi ( Windows.h )

BitBlt( Uchwyt , X , Y , Xs , Ys , BitMapa, 0 , 0 , TypRysowania )

Aby móc rysować musisz mieć uchwyt do okna które stworzysz, co za tym idzie... musisz mieć okno...

a przynajmniej jakiś uchwyt...

 

W taki sposób zdobędziesz uchwyt do konsoli - przynajmniej nie muszę cie uczyć jak się robi okno :)...

HANDLE Console 		= GetStdHandle(STD_OUTPUT_HANDLE);
HWND ConsoleWindow 	= GetConsoleWindow();
HDC ConsoleDC 		= GetDC(ConsoleWindow);

 

w HDC będziemy mieli nasze Uchwyt który pozwoli nam rysować na konsoli, uważaj jednak bo Cout będzie zamalowywać nasz rysowany obraz...

więc oczywiście nie warto wtedy używać Couta, jak się nauczysz SAM robić okno dla WinApi będziesz mógł zamienić konsolę na okno :)...

 

To pozwoli ci korzystać z CallBacków więc dużo nowy opcji i możliwości ^_^ !...

 

Wracając do tematu,

będziesz musiał stworzyć teraz sobię tablicę intów które będą KOLORAMI

unsigned int Pixele[ RozdzielczoscX * RozdzielczoscY ];

W taki sposób, pamiętaj że ustawiasz wartości w RGB

 

Jeśli zrobisz np. Pixele[ 0 ] = 0xFF00FF; to ustawisz pixel w lewym gónym rogu na różowy czyli kolor 0xFF00FF

Nie będę cie wszystkiego uczył, korzystaj z google jak nie ogarniasz ja tylko daję podpowiedzi... :)

 

Jak stworzysz już tablicę która będzie przechowywać pixele stwórz Bitmapę

BITMAPINFO PixelMap;

To będzie nasz obiekt który będziemy wysyłać do funkcji BitBlt która narysuje nam ją na konsoli...

 

Wypełnij wartości:

PixelMap.bmiHeader.biSize 			= sizeof(BITMAPINFO);
PixelMap.bmiHeader.biWidth 			= RozdzielczoscX;
PixelMap.bmiHeader.biHeight 		=  -RozdzielczoscY;
PixelMap.bmiHeader.biPlanes 		= 1;
PixelMap.bmiHeader.biBitCount	 	= 32;
PixelMap.bmiHeader.biCompression 	= BI_RGB;
PixelMap.bmiHeader.biSizeImage 		= 0;
PixelMap.bmiHeader.biXPelsPerMeter 	= 0;
PixelMap.bmiHeader.biYPelsPerMeter 	= 0;
PixelMap.bmiHeader.biClrUsed 		= 0;
PixelMap.bmiHeader.biClrImportant 	= 0;
PixelMap.bmiColors[0].rgbBlue 		= 0;
PixelMap.bmiColors[0].rgbGreen 		= 0;
PixelMap.bmiColors[0].rgbRed 		= 0;
PixelMap.bmiColors[0].rgbReserved 	= 0;

Ustaw biHeight na negatywie aby rysować od góry do dołu, jak zostawisz na pozytywie czyli BEZ MINUSA to będziesz rysować od dołu do góry czyli do góry nogami wszystko będzie...

Ale prawdę mówiąc to tylko kwestia spojrzenia ponieważ od ciebie będzie zależeć jak będziesz rysować...

 

Nową Bit mapę tworzymy tak:

HBITMAP BitMapa;

Potem musimy stworzyć sobie coś takiego a wynik funkcji zapisać do naszej BitMapy

CreateDIBSection( Uchwyt, BitMap Info ,DIB_RGB_COLORS, Tablica pixelów ,NULL,0);

Uchwyt to nasza konsola - na górze masz ( ConsoleDC czy jakoś tak powinno być w moim przykładzie już nie pamiętam xD )

BitMap Info to nasza PixelMap-a którą też stworzyliśmy wyżej, Tablica pixelów to nasz Unsigned Int Pixele[] 

resztę zostaw nie ruszoną...

 

powinno to wyglądać tak:

BitMapa = CreateDIBSection( ConsoleDC,&PixelMap,DIB_RGB_COLORS,(void**)&TablicaPixelow,NULL,0);

W taki sposób stworzyliśmy sobie coś na czym możemy rysować... teraz tylko zaznaczamy to czy też wybieramy funkcją Select

HDC PixelMapDC = CreateCompatibleDC(NULL);
SelectObject(PixelMapDC,BitMapa);

Teraz funkcja BitBlt wyświetli nam to co jest zapisane w naszym TablicaPIxelów jako obrazek na ekranie...

BitBlt(ConsoleDC,0,0,RozdzielczoscX,RozdzielczoscY,PixelMapDC,0,0,SRCCOPY);

 

Nie wiem czy pisałem to napiszę jeszcze raz:

pierwsze to Uchwyt GDZIE chcemy rysować

te dwa zera po ConsoleDC do kordy GDZIE ma być LEWY GÓRNY RÓG OBRAZKA

RozdzielczoscX oraz Y to wiadomo WYMIARY NASZEGO OBRAZKA

PixelMapDC to BitMapa uchwyt do naszego zbioru pixelów 

kolejne 0,0 to już nie pamiętam a i tak nigdy tego nie zmieniam xD

ostatnie to TRYB rysowania, SRCCOPY zamieni stare pixele na NOWE,

są też inne tryby rysowania ale nie polecam się nimi bawić zanim nie ogarniesz jak to wszystko działa...

 

 

od teraz możesz bez problemu rysować sobie to co tylko chcesz !...

 

 

To mój programik zrobiony... MNIEJ WIĘCEJ tą samą metodą...

 

 

Oczywiście nie obedzie się bez przeszukiwania Google, nauczenie tak w "locie" robienia grafiki od zera...

bo to cie prawdopodobnie interesowało widząc w poście SetPixel-a jest dość złożonym problemem :c...

 

Tu masz np. Funkcję która rysuje koło:

void QLDrawCircle(int ym, int xm, int r,unsigned int color)
{
   int x = -r, y = 0, err = 2-2*r;
   do {
      JDraw(xm+y, ym-x, color);
      JDraw(xm-x, ym-y, color);
      JDraw(xm-y, ym+x, color);
      JDraw(xm+x, ym+y, color);
      r = err;
      if (r <= y) err += ++y*2+1;
      if (r > x || err > y) err += ++x*2+1;
   } while (x < 0);
}

Poszukaj sobie w internecie Breshman-owych algorytmów

znajdziesz bez problemu funkcje do rysowania koła lini elips i dużo więcej

 

jak nauczysz się conieco to potem możesz przejść na grafikę 3D

Jej nauczysz się szybko z pierwszego kanału który ci tam na górze dałem OneLoneCoder wyszukaj w YT

 

Jeśli ktoś potrzebuje kontaktu:

YouTube/User/PanTobiPL

PanTobiPL@GMail.com

 

Jeśli ktoś chce ulepszyć mój post zamieść poniżej odpowiedź a jeśli jeszcze korzystam

z tego forum to wprowadzę poprawki do mojego posta...

 

 

kurde rozpisałem się tu, 40 minut poszłoooo :o...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...