Rysowanie w c++

0

Witam!

piszę pierwszy raz tutaj, właściwie dlatego, że jestem już zdesperowany. jestem inżynierem (drogownictwo), ale lubię programować. Przez całą szkołę robiłem programy w Pascalu, które np. symulowały grawitację kilku ciał (także w 3D wyświetlane metodą cross-eye), jakaś wizualizacja przenikania ciepła przez ściany, obracający się wiatraczek widziany w aksonometrii, itp. no i szybko doszedłem do momentu, gdzie Turbo Pascal był do tego słaby, a obecnie niemożliwy do zastosowania w tym co chcę i potrzebuję zrobić.

studiuję fizę i piszę ostatnio programy do obróbki dużych stert danych (dziesiątki MB) z eksperymentu, oczywiście w c++. powoli zbliża się moment, gdzie chciało by się robić jakieś wizualizacje danych

moje pytanie na początek brzmi: "jaka biblioteka/jaki sposób wykorzystać?"

na google znajduję albo poradniki na yt (10 filmów po 15minut, z których nic nie wynika), mój jeden kolega z informatyki daje mi jakieś tomiszcza i mówi, że żeby narysować pojedynczy pixel to w ogóle powinienem najpierw zainstalować jakieś środowisko, co ma kilka-kilkanaście gigabajtów; drugi kolega z automatyki i robotyki mówi mi coś o mikrokontrolerach karty graficznej, na forach internetowych takie tematy kwitowane są zawsze "poszukaj w google, pełno tego jest"...

może żeby rozjaśnić o co mi chodzi podam ramę programu, którą używałem od przeszło 10 lat w Pascalu:

program graphica;
 uses crt, graph;
 var s,t:integer;
begin
  clrscr;
 detectgraph(s,t);
 initgraph(s,t,'d:\Folder Macieja\Free Pascal\2.0.0\units\i386-win32\rtl');

 {tresc programu}

 closegraph;
end.

czy coś takiego w C++ W OGÓLE jest możliwe? bo moje dotychczasowe doświadczenia pokazują, że nie, lecz rozsądek i intuicja inżynierska podpowiadają, że kilka dekad rozwoju naszej cywilizacji komputerowej i tysiące miliardów dolarów w nią zainwestowane chyba taką możliwość powinny w końcu ludzkości już chyba przynieść, prawda?

na sam początek chciałbym kogoś poprosić właśnie o opinię która (jeśli jakaś jest) "biblioteka", czy jak to się tam mówi, pozwala możliwie najprościej otworzyć okno z funkcjami takimi jak "putpixel(x,y)" i "clearscreen" lub po prostu rysować na ekranie.

pozdrawiam!

0
Śmigło napisał(a):

Witam!
czy coś takiego w C++ W OGÓLE jest możliwe?

Z tego co wiem to nie, nie ma takiej mozliwosci w standardowym C++. Jedyne co mozesz zrobic to albo skorzystac z zewnetrznych, czesto wieloplatformowych bibliotek albo wywolywac bezposrednio funkcje systemowe.

Pewna liste bibliotek juz dostales. Ja bym do tego dorzucil jeszcze Allegro:

  1. Strona projektu: http://alleg.sourceforge.net/
  2. Tutorial wprowadzajacy: http://wiki.allegro.cc/index.php?title=Allegro_5_Tutorial/Displays
  3. Funkcje, o ktore pytasz: http://alleg.sourceforge.net/a5docs/5.0.10/graphics.html#drawing-operations

Kiedys tego uywalem i pisalo mi sie calkiem fajnie - niestety bylo to lata temu i nie wiem na ile ta biblioteka sie zmienila. Najlepiej bedzie jak przyjrzysz sie calej tej liscie we wlasnym zakresie i wybierzesz sobie taka, ktora Ci bedzie najlepiej odpowiadac.

Tak troche OT: zapoznales sie z biblioteka ODE? Nie jest to biblioteka graficzna, ale fizykom moze sie przydac: http://www.ode.org/

0

a QT?

0

jeśli chodzi o te ODE to fizykom się raczej nie przyda, może jakimś ludkom od budowy maszyn..

podoba mi się opcja opisana na cpp0x.pl, zwłaszcza, że to moja ulubiona strona o c++, ale to allegro też nie wydaje się skomplikowane. robię dość złożone algorytmy, ale nigdy nie robiłem żadnych klas ani obiektów - jak myślicie, lepiej korzystać z WinAPI czy Allegro? to pierwsze wydaje się bardziej przystępne. i ważne pytanie - czy można będzie aktualizować obrazek na bieżąco? chodzi mi o ruch.

jeśli chodzi o ten c++ builder to jest środowisko tak? niewiele z wikipedii zrozumiałem, ale chyba biblioteka się nazywa vcl? wydaje mi się mniej atrakcyjna opcja od winapi i allegro, chyba, że może ktoś uważa, że jest to vcl jest najprostsze. :)

0

Jak chcesz coś prostego i przystępnego, to użyj Pythona + pygame. Nie musisz konfigurować środowiska, ustawiać opcji linkera itp. Wystarczy Ci edytor tekstu, interpreter języka Python i moduł pygame.

import pygame, sys
from pygame.locals import *

# set up pygame
pygame.init()
# set up the window
windowSurface = pygame.display.set_mode((500, 400), 0, 32)
pygame.display.set_caption('Prosty program')
kolor=(255,255,255)

#potrzebne nam funkcje do rysowania
def putpixel(x,y):
	global kolor
	pygame.draw.rect(windowSurface, kolor, (x, y, 2, 2))
def setColor(r,g,b):
	global kolor
	kolor=(r,g,b)
def clearscreen():
	windowSurface.fill((0,0,0))

setColor(255,0,0) # ustawiam kolor czerwony

# rysuje linie o szerokosci 4 ustalonym kolorem od punktu (60, 60) do punktu (120, 60)
pygame.draw.line(windowSurface, kolor, (60, 60), (120, 60), 4)

setColor(0,255,0) # ustawiam kolor zielony

#rysuje piksel ustawionym kolorem na pozycji (100,100)
putpixel(100,100)

#clearscreen() # nie chcemy czyscic, bo nic nie zobaczymy na ekranie

# przerzucam 
pygame.display.update()

# run the game loop
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

Jeśli potrzebujesz jakiejś oklepanej wizualizacji danych, to nie musisz tego programować ręcznie. Możesz rzucić swoje dane na jakiś program/bibliotekę do rysowania wykresów.

1

jak myślicie, lepiej korzystać z WinAPI czy Allegro? to pierwsze wydaje się bardziej przystępne.
Hmm.

i ważne pytanie - czy można będzie aktualizować obrazek na bieżąco? chodzi mi o ruch.
Tak, można, zarówno w WinAPI jak i w Allegro. We wszystkim właściwie.

W jednym i w drugim zrobisz to czego potrzebujesz. Allegro (i każda inna biblioteka pod Windowsem) i tak korzysta z WinAPI.

Jest też SDL.

0
Śmigło napisał(a):

jeśli chodzi o te ODE to fizykom się raczej nie przyda, może jakimś ludkom od budowy maszyn..

OK.

Śmigło napisał(a):

robię dość złożone algorytmy, ale nigdy nie robiłem żadnych klas ani obiektów - jak myślicie, lepiej korzystać z WinAPI czy Allegro?

Na stronie projektu Allegro napisane jest, ze jest to biblioteka dla jezkow C i C++. Jezyk C nie jest jezykiem obiektowym (chociaz podobno mozna w nim pisac obiektowo jak sie troche pokombinuje i uzyje takich bibliotek jak GObject - nie uzywalem, wiec szczegolow nie znam) a co za tym idzie biblioteka ta tez obiektowa raczej nie jest - przynajmniej kiedys nie byla i patrzac na fragmenty dokumentacji to dalej nie jest.

Śmigło napisał(a):

to pierwsze wydaje się bardziej przystępne.

Masz dosc specyficzny gust :)

Śmigło napisał(a):

ważne pytanie - czy można będzie aktualizować obrazek na bieżąco? chodzi mi o ruch.

Kiedys napisalem prosta gierke na bazie Allegro i chodzilo to calkiem sprawnie. Nie sadze, aby w nowszych wersjach bylo inaczej :) Wpisz sobie na YouTube fraze "allegro library" - zobaczysz nie tylko tutoriale ale takze przykladowe gry.

Gorzej moze byc wlasnie z WinAPI (dotyczy GDI, bo artykul z cpp0x przypomina mi wlasnie opis GDI) i radzilbym sie dowiedziec czy masz wsparcie ze strony akceleratora. Jezeli tego wsparcia nie ma to animacje moga okazac sie troche mulowate w zaleznosci od tego co wlasciwie chcesz zrobic.

Wracajac do Allegro: dla mnie jest to calkiem fajna biblioteka do grafiki 2D (posiada tez inne funkcjonalnosci, o ktorych nie chce mi sie pisac). Nie wiem natomiast jak sprawdza sie w zastosowaniach 3D i nie wiem czy do 2D nie ma czegos lepszego.

Śmigło napisał(a):

jeśli chodzi o ten c++ builder to jest środowisko tak? niewiele z wikipedii zrozumiałem, ale chyba biblioteka się nazywa vcl? wydaje mi się mniej atrakcyjna opcja od winapi i allegro, chyba, że może ktoś uważa, że jest to vcl jest najprostsze. :)

Tak, C++ Builder to srodowisko, a VCL to biblioteka stworzona raczej do budowania interfejsu uzytkownika niz do zastosowan, o ktore pytasz - nie twierdze natomiast, ze sie nie sprawdzi bo nie probowalem robic takich rzeczy w VCLu. No ale jak rozwarzasz VCLa to warto tez rozwarzyc Qt (nie mylic z Quick Time :))

1

Gorzej moze byc wlasnie z WinAPI (dotyczy GDI, bo artykul z cpp0x przypomina mi wlasnie opis GDI) i radzilbym sie dowiedziec czy masz wsparcie ze strony akceleratora. Jezeli tego wsparcia nie ma to animacje moga okazac sie troche mulowate w zaleznosci od tego co wlasciwie chcesz zrobic.

W WinAPI można rysować na różne sposoby:

  • GDI - dość wydajne, ale maksymalnie niewygodne w użyciu. często gdy jest mowa o rysowaniu w WinAPI zakłada się, że chodzi o GDI

  • GDI+ - wygodne, ma duże możliwości (gotowe funkcje do rysowania, wypełniania, efekty) ale niezbyt wydajne

  • DirectDraw - każdy ci powie, że jest przestarzałe, ale działa i nie waham się go użyć. bardzo wydajne, ale ma ograniczone możliwości, co sprawia że trzeba się posiłkować funkcjami GDI albo implementować własne algorytmy rysowania np. linii

  • Direct3D - bardzo wydajne, ale powstało głównie do grafiki 3D, i rysowanie grafiki dwuwymiarowej nie należy do przyjemności.

  • OpenGL (stare) - bardzo wydajne, jw. powstało dla 3D, ale do 2D też się nadaje. wymaga jednak nauki bo mocno odbiega od bibliotek typowo 2D

  • OpenGL (nowe) - armata na muchę, absurdalne wymagania sprzętowe jak na prosty program z grafiką 2D, nie działa na wielu kartach zintegrowanych z powodu braku sterowników

  • Direct2D - zalecane obecnie przez Microsoft. nie mialem do czynienia więc nie komentuję. nie działa pod XP.

0

niewiele mi to wszystko mówi. na razie wszystko co udało mi się zrobić to zdecydowanie się na allegro 5 i skonstatowanie, że internet jest pełen śmieci na ten temat

poradnik na cpp0x nie działa, bo:

  1. nawet w najnowszym Devie c++ nie można pobrać aktualizacji (serwer już pewnie dawno nie działa)
  2. na jutubie poradniki są do codeblocksa, visuala i wszystkiego innego.
  3. ściągając tę bibliotekę okazuje się, że jest coś takiego jak wersja binarna i źródłowa
  4. wersja źródłowa się nie kompiluje, bo brakuje jakichś plików, jak ściągnąłem jakąś binarną to skopiowałem te pliki z folderów bin, dll i include, ale przy kompilacji wciąż czegoś brakuje. (kompiluję program skopiowany z cpp0x deklarujący obrazek, ale chyba jeszcze nic nie rysujący)

w sumie nie jestem zaskoczony, bo skoro męczę się już z tym tyle lat, to czemu niby teraz miałoby się udać...

0

Do wszystkiego źle podchodzisz. Nie jesteś otwarty na nowe/współczesne rozwiązania (przynajmniej jeśli chodzi o dobór środowiska programistycznego).

  1. http://sourceforge.net/projects/orwelldevcpp/ - tutaj się wzięli za rozwijanie Dev C++, ostatnia aktualizacja 5 dni temu. Daruj sobie ten stary Dev C++ z http://www.bloodshed.net/
  2. To oznacza, że tych narzędzi najczęściej się używa i są aktualnie rozwijane.
  3. Allegro jest wyjątkowo toporne jeśli chodzi o konfigurowanie swojego środowiska pracy (przynajmniej jak to kiedyś próbowałem pod Linuksem). Biblioteka SDL jest dużo lepiej pomyślana pod tym względem.
  4. Jak masz jakieś błędy to pokaż je, umożliwi to zdiagnozowanie przyczyny. Na razie domyślam się, że stary Dev C++ ze swoim starym MinGW jest przyczyną (o ile poprawnie podałeś opcje linkera).
0

dziś już nie mam siły - nie rozumiem tylko jak to możliwe, że to takie skomplikowane. najchętniej pisałbym programy w notatniku i kompilował je jakimś programem, w którym wystarczy jedno kliknięcie, ale mimo zapewnień znajomego informatyka, że tak się da, to tak się nie dało.

więc oto co zamierzam zrobić jutro:

  • ściągnę najnowszego orwell dev c++,
  • rozpakuję allegro 5.0.12 i tam są foldery bin, lib i include
  • pliki które są w tych folderach skopiuję odpowiednio do folderów bin, lib i include w folderze: "E:\Programowanie\C++\Środowisko\Dev-Cpp\MinGW32" lub podobnym.
  • włączę ten orwell dev c++
  • skopiuję do nowego projektu kod programu stąd: http://cpp0x.pl/kursy/Kurs-Allegro-4-x-C++/Odpalamy-Allegro/64

czy są jakieś błędy w moim rozumowaniu? jeśli nie to jutro wkleję tu jakie błędy wystąpiły przy kompilacji ;)

0

czy są jakieś błędy w moim rozumowaniu?

Oczywiscie, chciales "latwo" w "C++". Tak sie niestety nie da.

0
Śmigło napisał(a):
  • ściągnę najnowszego orwell dev c++,

Nie lepiej zainstalowac Visual C++ w wersji express?

Śmigło napisał(a):
  • pliki które są w tych folderach skopiuję odpowiednio do folderów bin, lib i include w folderze: "E:\Programowanie\C++\Środowisko\Dev-Cpp\MinGW32" lub podobnym.

Robisz sobie troche balagan. Lepiej po prostu wejdz w jakies opcje i dodaj sciezki do plikow naglowkowych i libow (byc moze jeszcze binariow o ile faktycznie to konieczne).

Śmigło napisał(a):

To jest kurs omawiajacy Allegro w wersji 4. Ty natomiast chcesz skorzystac z Allegro 5. Niekoniecznie musza byc kompatybilne. Tutaj masz przykladowy kod: http://wiki.allegro.cc/index.php?title=Allegro_5_Tutorial/Displays

Jak widac w wersji 4 uzywalo sie funkcji allegro_init, podczas gdy w wersji 5 korzysta sie z funkcji al_init. Rowniez sciezki do plikow naglowkowych moga wygladac troche inaczej.

0

najchętniej pisałbym programy w notatniku i kompilował je jakimś programem, w którym wystarczy jedno kliknięcie, ale mimo zapewnień znajomego informatyka, że tak się da, to tak się nie dało.

Oczywiście że się da.

c:\myprogs\c>cl wparlpar.c kernel32.lib user32.lib
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

wparlpar.c
Microsoft (R) Incremental Linker Version 12.00.21005.1
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:wparlpar.exe
wparlpar.obj
kernel32.lib
user32.lib

c:\myprogs\c>

ale nie po to wymyślili pasażerskie samoloty by uskuteczniać dziś piesze wędrówki ludów.

0

aż mi się nie chce pisać, co nie działa. bo nic nie działa :P za dużo by pisać. Mimo wszystko naprawdę bardzo Wam dziękuję za pomoc, nie spodziewałem się, że spotkam się z takim zaangażowaniem z Waszej strony, wielkie dzięki za poświęcony czas! :)

jeśli ktoś jest z Warszawy to chętnie umówiłbym się, żeby ktoś tu przyszedł i mi to jakoś ustawił, jakieś korepetycje czy cuś. jak mówi marian paździoch - oczywiście nie za nic, ale też bez przesady, bo szczególnie bogaty nie jestem :) mój e-mail:

m.smiglo <at> tlen . pl

pozdro

0

i sprawa jest raczej pilna, bo w ogóle spie*****łem kompilator. o ja naiwny! myślałem, że zainstalowanie tego orwell deva 5.6.3 w innym folderze nie wpłynie na działanie starego deva 5.4.0 odinstalowałem oba, zainstalowałem starego, zrestartowałem kompa i teraz każdy program kompiluje się w 0,02 sekundy, ale nie powstaje plik wykonywalny. żywioł programowania skutecznie strzeże swych tajemnic :) "chciałeś odkryć moje tajemnice, masz za swoje!"

0

Zainstaluj Linuksa, to dużo bardziej przyjazne środowisko pracy dla programisty C++.

0

A ja w przeciwieństwie do Spine radze Ci zostać przy Windowsie i zainstalować Visual Studio. Swoją przygodę z programowaniem zacząłem z Dev C++, parę ładnych lat temu, i wówczas nawet przykładowe programy z Symfonii C++ nie chciały mi się tam kompilować - nie wiem jak jest teraz, ale to zakończyło moją przygodę. Dopiero po roku spróbowałem ponownie, tym razem w Visualu i wszystko chodziło jak trzeba. Co do Linuksa, jeśli lubisz się bawić i uczyć nowych rzeczy to ok, jeśli chcesz jednak zrobić ten projekt w miarę szybko i bezboleśnie to Windows najprawdopodobniej w Twoim wypadku będzie lepszy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1