TobiPL Posted September 6, 2019 Report Share Posted September 6, 2019 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... Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.