reprezentacja grafów

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

reprezentacja grafów

Nowy postprzez sliwecki » czwartek, 21 października 2010, 12:42

Witam , powiedzcie mi bo w grafice to ja jestem laik , jak za pomoca Borland c++ wyrysowac graf, dodwac wierzcholki i krawedzie itp, chodzi mi cos w tym stylu jak tu kolega zrobil tylko ze on to robil w Qt http://kwesoly.net/programowanie/cpp/pr ... ra-fleury/
Avatar użytkownika
sliwecki
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): czwartek, 21 października 2010, 12:37
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: windows7
Kompilator: borland c++
Gadu Gadu: 0
    Windows 7Firefox

Re: reprezentacja grafów

Nowy postprzez Cyfrowy Baron » czwartek, 21 października 2010, 13:21

Musisz posłużyć się GDI, czyli rysujesz na płótnie typu TCanvas - trochę informacji znajdziesz w serwisie Cyfrowy Baron w dziale: porady -> grafika. Tam również znajdziesz informacje jak rysować z wykorzystaniem GDI+, które moim zdaniem jest prostsze w obsłudze, ale mniej wydajne., gdyż nie korzysta ze wsparcia sprzętowego.
Możesz też posłużyć się DirectDraw, ale to już bardziej skomplikowane, o tym również przeczytasz dział: teoria -> DirectDraw. Samo narysowanie takiego grafu jak na rysunku, nie jest problemem, ale jeżeli ma to się jakoś zmieniać w zależności od zadanych parametrów, to będziesz musiał poduczyć się, gdyż nie ma na to gotowych algorytmów, o ile nie znajdziesz gdzieś gotowych bibliotek umożliwiających realizację tego zadania.

Z tego co zauważyłem to autor udostępnił źródła.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: reprezentacja grafów

Nowy postprzez sliwecki » czwartek, 21 października 2010, 15:21

a da sie urzynając GDI zrobic tak ze np klikam na narysowana krawędz i zmieniam jej przepustowość ? chodzi mi o to ze program bedzie wiedzial która krawędź czy wierzchołek kliklem .
Avatar użytkownika
sliwecki
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): czwartek, 21 października 2010, 12:37
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: windows7
Kompilator: borland c++
Gadu Gadu: 0
    Windows 7Firefox

Re: reprezentacja grafów

Nowy postprzez Cyfrowy Baron » czwartek, 21 października 2010, 15:52

Nie da się. To co narysowane jest tylko rysunkiem nie obiektem. Pisząc o tym, że nie ma na to gotowych algorytmów, miałem również na myśli właśnie takie efekty. Musisz to kliknięcie w linię zaprogramować. Jak? Program musi zapamiętać współrzędne linii i w przypadku kliknięcia, sprawdzać, czy kursor klika w pozycji na której narysowana jest linia, czy nie. Można by to też sobie uprościć, jeżeli np. tło jest jednolite, np. białe, to można sprawdzić, jaki jest kolor klikniętego piksela w pozycji kursora, jeżeli jest czarny to linie, jeżeli nie to tło. To rodzi jednak inny problem, linii może być wiele i wszystkie mogą być innego koloru, dlatego trzeba połączyć zapamiętywanie przez program pozycji narysowanych linii ze sprawdzaniem koloru piksela.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: reprezentacja grafów

Nowy postprzez polymorphism » czwartek, 21 października 2010, 18:23

Zamiast sprawdzać piksele, lepiej użyć jakiegoś wzoru na to, czy dany punkt, w tym przypadku pozycja kursora, należy do prostej (oczywiście z jakimś marginesem, żeby nie trzeba było celować co do piksela).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: reprezentacja grafów

Nowy postprzez Cyfrowy Baron » czwartek, 21 października 2010, 19:06

Zastanawiałem się nad tym, ale sprawa nie jest prosta, no bo jak sprawdzić, czy wskazany punkt znajduje się na trasie dwóch współrzędnych?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: reprezentacja grafów

Nowy postprzez polymorphism » czwartek, 21 października 2010, 21:26

No przecież pisałem, że trzeba użyć jakiegoś wzoru na obliczenie tego. Tym jakimś wzorem będzie wzór na prostą:

TeX: y = ax + b

Wystarczy obliczyć TeX: a i TeX: b odcinka, podstawić TeX: x kursora i sprawdzić, czy wynik zgadza się z TeX: y kursora (uwzględniając pewną tolerancję). Oczywiście trzeba oddzielnie potraktować przypadek odcinka pionowego, ale tego tłumaczyć - mam nadzieję - nie trzeba. Gwoli ścisłości, wszystkie punkty, które leżą przed lub za odcinkiem, od razu odrzucamy.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: reprezentacja grafów

Nowy postprzez Cyfrowy Baron » piątek, 22 października 2010, 07:58

Chyba nie do końca ciebie rozumiem. O ile sprawdzi się to w przypadku prostych poziomych i pionowych to co z ukośnymi.

Załóżmy, że przechowuję współrzędne odcinka:

TeX: begin: x = 10, y = 3;<br />end: x = 80, y = 30;<br /><br />cursor: x = 33, y = 12;

Kursor wskazuje na linię, ale jak to się ma do Twojego wzoru?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: reprezentacja grafów

Nowy postprzez polymorphism » piątek, 22 października 2010, 10:24

O ile sprawdzi się to w przypadku prostych poziomych i pionowych to co z ukośnymi.

Wzór akurat sprawdzi się dla prostych poziomych i ukośnych, dla pionowych nie - pisałem o tym.

Kursor wskazuje na linię, ale jak to się ma do Twojego wzoru?

Wydawało mi się, że opisałem to wystarczająco :zawiedziony:

Mamy punkty opisujące odcinek:

TeX: A = (x_{A}, y_{A})<br />B = (x_{B}, y_{B})

obliczamy TeX: a dla wzoru TeX: y=ax+b:

TeX: a=\frac{y_{B}-y_{A}}{x_{B}-x_{A}}

teraz TeX: b:

TeX: b=y_{A}

Podstawiamy liczby:

TeX: y=ax+b<br /> y=\frac{30-3}{80-10}x+3<br />y=0,3857142857x+3

Teraz pod TeX: x podstawiamy pozycję kursora TeX: x_{C}, uwzględniając odpowiednie przesunięcie, ponieważ TeX: b nie jest obliczone dla TeX: x równego 0, tylko dla TeX: x_{A}:

TeX: y=0,3857142857 * (x_{C} - x_{A}) +3<br />y=0,3857142857  * (33 - 10) +3<br />y = 11,4857142854<br />y\approx11

Czyli wszystko się zgadza, jeśli uwzględnimy pewną tolerancję.

Oczywiście to wszystko ma zastosowanie tylko wtedy, gdy TeX: x_{A} < x_{B} i TeX: x_{A} \leq x_{C}\leq x_{B}

Mam nadzieją, że już wszystko jasne ;)
Ostatnio edytowano piątek, 22 października 2010, 16:45 przez polymorphism, łącznie edytowano 2 razy
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: reprezentacja grafów

Nowy postprzez Cyfrowy Baron » piątek, 22 października 2010, 10:33

Niby wszystko jasne, ale to nie zadziała w praktyce, gdyż w przypadku gdy obok siebie znajdują się dwie linie w miarę równoległe względem siebie, to wynik będzie wskazywał na obydwie, a to przez to przybliżenie.
Twój kod można już praktycznie wykorzystać do tego celu, ale trzeba ten wzór zastosować nie tylko dla początku linii, ale również dla jej końca, gdyż linie mogą się ze sobą łączyć, więc mogą mieć ten sam początek lub koniec, ale nigdy dwóch na raz. Gdyby udało się ze wzoru wyeliminować te wartości przybliżone, to działałoby idealnie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: reprezentacja grafów

Nowy postprzez polymorphism » piątek, 22 października 2010, 10:41

(...) a to przez to przybliżenie.

Jeśli piszesz o ucięciu części ułamkowej, to nie ma to większego znaczenia, ponieważ operujesz na jednostkach, które są liczbami całkowitymi (chodzi o pozycję kursora).

(...) ale trzeba ten wzór zastosować nie tylko dla początku linii, ale również dla jej końca

Nie bardzo rozumiem, jakie to ma znaczenie?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: reprezentacja grafów

Nowy postprzez Cyfrowy Baron » piątek, 22 października 2010, 11:39

Sam nie wiem! Nie opisałeś tego dość jasno. Co w zasadzie oznaczają te wartości. W programie to będzie wyglądać tak:

linia: begin(10, 3) - end(80, 30)
kursor(33, 12)

tylko takie wartości będę miał do testu. By wzór się na coś przydał musi mi zwrócić dla początku linii (10, 3) po podstawieniu pod niego pozycji kursora czyli (33, 12), ale ponieważ mogą być dwie linie łączące się na początku, czyli mające tą samą wartość begin to trzeba obliczyć również koniec linii by nie było wątpliowości o którą linię chodzi.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: reprezentacja grafów

Nowy postprzez polymorphism » piątek, 22 października 2010, 12:24

(...) ale ponieważ mogą być dwie linie łączące się na początku, czyli mające tą samą wartość begin to trzeba obliczyć również koniec linii by nie było wątpliowości o którą linię chodzi.

A co ty chcesz tam obliczać?! Przecież koniec linii masz wyznaczony przez punkt end (moje TeX: B)?! :zawiedziony: Bez początku i końca odcinka, a dokładniej bez dwóch punktów, przez które przechodzi prosta, nie byłbym w stanie obliczyć wartości TeX: a.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: reprezentacja grafów

Nowy postprzez Cyfrowy Baron » piątek, 22 października 2010, 12:31

Nie widzę tego, jest to dla mnie zbyt wirtualne, musiałbym zobaczyć algorytm w c++. Jeżeli A i B przechowują tylko pojedyncze liczby to nie da się określić współrzędnych linii. A i B muszą mieć wartości typu POINT by to miało sens.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: reprezentacja grafów

Nowy postprzez polymorphism » piątek, 22 października 2010, 12:40

TeX: A i TeX: B są punktami, więc muszą posiadać co najmniej dwie współrzędne, dlatego też POINT będzie odpowiednim typem.

W sumie nie wiem, dlaczego masz taki problem z tym, przecież wszystkie obliczenia dokonywane są na współrzędnych, które powinny być dla Ciebie zrozumiałe?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 11 gości

cron