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ć...

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