• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Prosta grafika w c++ bez wykorzystania dołączanych bibliotek - przetłumaczenie funkcji z pascala na c++

0 głosów
593 wizyt
pytanie zadane 28 lutego 2021 w C i C++ przez zuzannaruda Nowicjusz (240 p.)

Witam,
uczę się obecnie programować grafikę w c++. Problem w tym że programy mają działać tylko na standardowych bibliotekach c++, wszystkie funkcje graficzne mają być napisane własnoręcznie wykorzystując algorytmy z podręcznika.
Posiadam materiały napisane jeszcze w Pascalu którego nie znam, proszę o pomoc z przetłumaczeniem przykładów z Turbo Pascala na c++.
Czy c++ posiada też taką funkcję set_pixel i jak ją użyć, nie rozumiem reż co to jest to xINTEGER, pierwszy parametr pętli for.
Nie mam za dużo na to czasu więc dziękuję z góry wszystkim za pomoc i pozdrawiam.

Kod Pascala:


procedure Line (x1, x2, y2, y2,)
begin
dx := x2-x1; dy := y2-y1
m := dy/dx; y := y1;
for xINTEGER:=x1 to x2 do
begin
 set_pixel(xINTEGER, ROUND(y));
 y=y+m;
end;
end;

A tu moje wypociny, proszę tylko o wyrozumiałość.

void Line(int x1, int x2, int y1, int y2) {

	int dx = x2 - x1; int dy = y2 - y1;
	int m = dy / dx; int y = y1;
	for (int y = x1; y = x2; y = y + m) {
		COLORREF SetPixel(
			HDC      hdc,
			int      x,
			int      y,
			COLORREF color
		)
	}
};


 

1 odpowiedź

+1 głos
odpowiedź 28 lutego 2021 przez draghan VIP (106,230 p.)

uczę się obecnie programować grafikę w c++. Problem w tym że programy mają działać tylko na standardowych bibliotekach c++

To całkiem spory problem, bo biblioteka standardowa C++ nie zawiera wsparcia dla programowania grafiki. :)

Z tego co widzę, używasz struktur z API Windows, który nie jest częścią standardu. Ale gdyby przymknąć oko na ten fakt, to brakuje Ci elementarnej wiedzy na temat programowania w C++.

        COLORREF SetPixel(
            HDC      hdc,
            int      x,
            int      y,
            COLORREF color
        )

To jest deklaracja funkcji. Żeby ją wywołać, musisz wypełnić odpowiednio jej parametry, takie wywołanie wyglądałoby tak:

        SetPixel(hdc, x, y, color);

Brakuje Ci dwóch zmiennych, których wymaga ta funkcja: hdc i color. O ile color nie jest problemem, bo po prostu możesz sobie zdefiniować taką zmienną:

const COLORREF red   =  0x000000FF;
SetPixel(hdc, x, y, red);

to z hdc jest większy problem, bo nie możesz sobie ot tak zrobić takiej zmiennej. To jest kontekst urządzenia po którym zamierzasz rysować. HDC możesz dostać z uchwytu okna. Czy posiadasz uchwyt okna w swojej aplikacji?

komentarz 28 lutego 2021 przez zuzannaruda Nowicjusz (240 p.)
Tę funkcję SetPixel() znalazłam jako podobną do set_pixel(xINTEGER, ROUND(y)) w Pascalu. Nie wiem jeszcze jak się ją używa i czym można zastąpić tę paskalową. Nie posiadam na razie uchwytu. Próbuję na razie przetłumaczyć ten pewnie prosty przykład. Proszę mi napisz jak wygląda taka pętla for z przykładu w c++.
komentarz 28 lutego 2021 przez draghan VIP (106,230 p.)

Musisz założyć w takim razie, że uchwyt do kontekstu urządzenia dostaniesz z zewnątrz. Sensownym jest również założenie że kolor dostaniesz z zewnątrz. Takie zewnętrzne dane trafią do parametrów tej funkcji.

W takim wypadku Twój kod jest prawie ok. W warunku pętli for masz jeszcze błąd:

for (int y = x1; y = x2; y = y + m) {
// y = x2 to przypisanie, nie porównanie,
// operator == służy do porównywania wartości, więc powinno być:
for (int y = x1; y == x2; y = y + m) {

Biorąc to wszystko pod uwagę, kod takiej funkcji wyglądałby tak:

void Line(int x1, int x2, int y1, int y2, COLORREF color, HDC hdc) {
 
    int dx = x2 - x1; int dy = y2 - y1;
    int m = dy / dx; int y = y1;
    for (int y = x1; y == x2; y = y + m) {
        SetPixel(hdc, x, y, color); // po instrukcjach stawiamy średnik
    }
} // po definicjach funkcji nie stawiamy średnika

Jeśli to ma działać, to ten kod nic Ci nie da. Programy w WinAPI są trochę skomplikowane i polecam zapoznać się z jakimś tutorialem (przykładowy tutorial) przed dalszymi krokami.

komentarz 28 lutego 2021 przez zuzannaruda Nowicjusz (240 p.)
A jaki ewentualnie inny język mógłbyś polecić do takiego zadania?
komentarz 28 lutego 2021 przez j23 Mędrzec (195,220 p.)

W tym tutorialu masz przykładowy kod aplikacji okienkowej (choć jeśli używasz jakiegoś IDE, to po prostu wygeneruj w kreatorze projekt aplikacj Win32). Wystarczy dodać obsługę WM_PAINT, w której będziesz rysować tymi swoimi funkcjami:

case WM_PAINT: {
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);
    
    Line(0, 100, 0, 100, 0xFF, hdc);

    EndPaint(hwnd, &ps);
    return 0;
}

 

komentarz 1 marca 2021 przez draghan VIP (106,230 p.)

A jaki ewentualnie inny język mógłbyś polecić do takiego zadania?

Ciężko zarekomendować inny język do zadania w którym masz to wykonać w C++. laugh

Ale musisz sobie zdawać sprawę z tego że musisz mieć jakieś podstawy samego C++ i WinAPI żeby to dalej pociągnąć.

Podobne pytania

0 głosów
0 odpowiedzi 475 wizyt
pytanie zadane 7 grudnia 2016 w C i C++ przez tomek231999 Nowicjusz (140 p.)
0 głosów
1 odpowiedź 1,284 wizyt
pytanie zadane 4 stycznia 2017 w C i C++ przez tomek231999 Nowicjusz (140 p.)
0 głosów
4 odpowiedzi 581 wizyt

93,600 zapytań

142,524 odpowiedzi

322,993 komentarzy

63,085 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...