• 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++

VPS Starter Arubacloud
0 głosów
338 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 (194,920 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 265 wizyt
pytanie zadane 7 grudnia 2016 w C i C++ przez tomek231999 Nowicjusz (140 p.)
0 głosów
1 odpowiedź 940 wizyt
pytanie zadane 4 stycznia 2017 w C i C++ przez tomek231999 Nowicjusz (140 p.)
0 głosów
4 odpowiedzi 434 wizyt

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...