Skocz do zawartości
hojrak6

Vb 2005 I Wykres Funkcji

Rekomendowane odpowiedzi

Witam

 

 

Mam do napisania program przedstawiajacy jakis tam wykres na osi. Problem w tym ze nie wiem ktory komponent sluzy do przedstawiania takiego wykresu w visual basicu. Posiadam MS Visual Studio 2005 prof.

 

W internecie nie ma za duzo na ten temat. Gdzies sie doszukalem ze w delphi jest komponent tchart, teechart, gdzies na dysku znalazlem delphi zeby chociaz zobaczyc jak to wyglada i najlepsze jest to ze nie mam tego komponentu mimo ze mam versje rozbudowana maksymalnie(Delphi 7 SE 7.2), ale mniejsza z tym probowalem wyszukac tchart pod visual basica, na paru stronach jest ten komponent platny dodatkowo.

 

Na jakim komponencie w vb zrobie wykres funkcji na ukladzie wspolrzednych ?? ewentualnie gdzie moge znalesc tcharta pod vb za free ?

 

Pozdrawiam

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Witam

 

Juz jakos sobie rysuje pkt i linie. Ale teraz mam inny problem.

Najpierw moze pokaze jak to rysuje:

Dim g As Graphics = PictureBox1.CreateGraphicsg.DrawLine(Pens.Black, 5, 54, 52, 54)g.DrawRectangle(Pens.Black, 5, 54, 3, 3)

To taki maly przyklad.

 

Teraz mam problem taki że po kliknieciu na picture boxa w tym miejscu ma sie pojawic pkt.

I nie wiem jak zrobic zeby zczyttac wspolzeczne klikniecia na pictureboxie.

Znalazlem picutrbox.pointtoclick i pointtoscreen, jakos to cos zczytuje ale na ppewno nie wspolrzedne bo zrobilem sobie pkt na (5,5) i po kliknieciu na nim w obu przypadkach pojawialo sie zupelnie cos innego. 2 sprawa ze przy testach zauwazylem ze np jak raz klikne to te funkcjie cos zczytaja ale po 2 kliknieciu juz nic sie nie zmienia, tak jak by funkcjia picturebox1_click dzialala tylko 1 raz, jak to zrobic zeby za kazdym kliknieciem pojawialy sie nowe wspolrzedne i wtedy bede mogl rysowac nowe pkt.

 

dzieki za pomoc

Pozdrawiam

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiem wiem ze pkt 00 jest w gornym rogu, wedlug tego tez jest wstawiony pkt na ktory klikam, i te funkcje zczytuja zupelnie co innego niz wspolzedna tego pkt.

 

 

[Edit]

Juz wiem jak zrobic zczytanie wspolrzednych, przez funkcjie picturebox_mousedown i wspol_click = New System.Drawing.Point(e.X, e.Y)

 

Dokladnie robie program rysujacy otoczke wypukla algorytmem Grahama. Teraz jeszcze nie wiem jak opoznic rysowanie sie lini, chce osiagnac efekt taki ze linia sie rysuje w zwolnionym tepie bo jak zrobie samo drawline to otoczka sie poprostu pojawia a ma sie rysowac.

Edytowane przez hojrak6

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

musisz to zrobić z użyciem timera... taki komponencik powinien być. Przy kazdym wywołaniu metody OnTimer() dopisujesz kolejny punkt do tablicy przechowujacej współrzedne puntów i wywołujesz Invalidate() na tej kontrolce po której rysujesz i ona się odświeży. W metodzie OnPaint() tej kontrolki powinieneś narysować taki kawałek wykresu jaki masz w tej tablicy ze współrzędnymi.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Witam

 

Mam znowu problem z wykresem.

 

Ju zmam wszystko zrobione, problem wtym ze gdy okienko programu cos przyslni, albo wyjade za ekran, to moj rysunek znika. Jak zrobic zeby po minimalizacji, przykryciu, wyjechaniu za okno rysunek nadal byl na pictureboxie ???

 

Pozdro

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie wszyscy sobie zdają sprawę (bo często widzę takie pytania), że każda kontrolka, każde okno, po przysłonieciu i odsłonięciu dostaje komunikat aby się odmalować. W .NETcie wywoływana jest metoda Paint(), czy OnPaint() i w niej trzeba odmalować cały rysunek od nowa.

 

Nie wystarczy na oknie raz czegoś namalować - okno jest odrysowywane jeśli jest przysłonięte i trzeba zadbać o rysowanie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

tak jest metoda paint, ale jak z niej skorzystalem, to nie dokonca program tak dzialal jak bym chcial tzn ze przyslonie okno to sie samo rysuje mimo ze wczesniej nie byl nacisniety przycisk od rysowania.

A zrobilem to tak:

mam procedure rysuj

 

pod przyciskiem mam tylko wywolanie tej procedury.

 

Wiec wywolalem procedure picturebox1_paint i tam tez umiescilem ta procedure rysuj.

 

Moze to trzeba jakos inaczej wywolac z metoda paint ??

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

paint nie służy do rysowania, pain służy do odrysowywania. Okna nie wystarczy raz namalować. Procedura rysująca rysuje po postu to co ma narysować (np przycisk) i potem przy kazdym zakryciu i odsłonięciu jest ona ponownie wołąna przez system żeby się odrysował dany fragment okna.

 

Okna tak naprawdę nie są elementami, które są raz narysowana i koniec. Okno to jest po prostu miejsce w którym kontrolki się odrysowują za każdym razem jak sie je odsłoni. To tylko mechanizm odrysowywania daje złudne wrażenie że chowamy okno pod okno :). Zresztą w windowsie można wybrać przenoszenie okna z podlągem lub bez. To pierwsze wymaga większego zuzycia CPU bo i odrysowywanie jest częstsze.

 

Tak że przycisk Rysuj powinien tak naprawdę zainicjować obiekt (kontrolkę) przechowujący dane punktów z wykresu I tyle. On nie powinien nic rysować. Na koniec w obsłudze przycisku wołasz Unvalidate() i windows mówi w tym momencie do twojego okna... odrysuj się!

Teraz w metodzie paint() tej kontrolki rysujesz wykres wedle punktów jakie zainicjowałeś przyciskiem rysuj.

Jesli wczesniej nie nacisniesz przycisku rysuj to kontrolka nie bedei wiedziała co rysować więc od biedy moze rysować tylko sam układ współrzednych. A jeśli dane nie są gotowe to zlać po protu dalsze rysowanie wykresu.

 

Zazwczaj nie powinno się ręcznie wywoływać metody Paint() tylko zgłosić że obszar należy odmalować.

Edytowane przez PelzaK

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Witam

 

Nie moge sobie poradzic z rysowaniem otoczki (spowolnmieniem rysowania).

 

Wiec chcialem zrobic to tak ze w petli dodaje po pixelu i robie opuznienie.

Zakladsajac ze mam narysowac linie pomiedzy 2 punktami A(Xa,Yx) i B(Xb,Yb)

 

Czyli robie petle od i = Xa do Xb zeby pixel byl co jeden, ale y musze obliczyc.W tej petli robie :

 

W tabliucach matematycznych znalazlem taki wzor na y dla prostej y - ya = (yb-ya)/(xb - xa) * (x - xa)

Przeksztalcilem to na 2 sposoby i zaden nie dziala:

1. y = (yb-ya)/(xb - xa) * (x - xa) + ya

2. y = (yb-ya)/(xb - xa) * x - (yb-ya)/(xb - xa) xa - ya

 

W miejsce x wstawiam za kazdym razem moje " i " zeby obliczac dla danego x wspol y.

 

I nie wiem wlasnie jak to zrobic zeby ryspwac linie po 1 pikselu.

Dokladnie to w petli chce zrobic rysowanie od piksela poprzedniego do nastepnego, tak powstanie linia.

Juz nie mam innego pomyslu jak zrobic rysowanie lini, narazie pojawia sie otoczla w tepie blyskawicznym, nawet dla 300 pkt - do tylu ograniczlem program.

 

A z odrysowywaniem dalem sobie spokoj, nie wychodzi mi za dobrze, pozatym w Basicu nie znalazlem Unvalidate, jedyne co znalazlem to Update() ktore jest opisane "Causes the control to redraw the invalidate regions within is clien area" Problem w tym ze jak to tobilem to sie odrysowywalo w momecie wyjechania za monitor a gdy przykrylem innym oknem klikajac na inne okno na pasku start to sie nie odrysowywalo. Z tym sobie daje spokoj, rozpracuje to ale nie na tym programie, narazie musze zrobic efekt rysowania lini, w niedziele oddaje program.

Pozdrawiam

Edytowane przez hojrak6

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

no to update(), może pomyliłem nazwy :)

 

Rysowanie powolne musisz zrobić za pomocą timera. Przy kazdym wywołaniu metody onTimer() np zwiększasz zakres rysowanego obrazka.

 

Innymi słowy program mógłby wyglądać np tak:

 

funkcja Rysuj( int progress ) - progress jest to zmienna która informuje o tym jaka część wykresu powinna zostać narysowana licząc od początku. Jeśli podasz tam 50 (np procent) to powinno sie narysować (normlanie szybko w pętli) połowa wykresu. zmienna progress powinna zostać zapamietana w prywatnym memberze klasy (po co? za chwile)

 

funkcja Paint() - powinna wywoływać funkcję Rysuj(), która narysuje się do tego miejsca co ostatnio się rysowała korzystając z zapamietanej wartości zmiennej progress, o której mowa wyżej

 

funkcja OnTimer() - jest wywoływana co określony odstęp czasu, który mozna dowolnie ustawić, np co 100ms. Przy każdym wywołaniu zwiększasz zmienną myProgress (member w klasie) i wywołujesz Rysuj(myProgress); Przy dojściu do 100% timer powinien przestać wywoływać funckję Rysuj(); może też sie po prostu zatrzymać.

 

wtedy co 100ms będzie wywoływana funkcja Rysuj(progress) z coraz to większymi wartościami zmiennej progress, czyli za kazdym wywołaniem wykres będzie się rysował w większym kawałku.

Z grubsza będzie to działać, można by pokusić się o optymalizację, aby w kazdej iteracji nie malować całego wykresu od nowa, ale wierz mi, komputery są na tyle szybkie, że będzie się rysować ślicznie szybko :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No wlasnie i chodzi mi o to ze nie wiem za bardzo jak napisac funkcje rysuj. Bo majac 2 punkty A i B musze jakos w petli wyliczyc punkty pomiedzy tymi punktami. Jezeli np mam A(2,3) i B(6,8 ) to zeby zrobic opuznienie najlepiej jak bym robil rysuj linie z (2,3) do (3,y),opuznienie, potem z (3,y) do (4,y) itd. do pkt B. czyli w kazdym przebiegu daje lekkie opuznienie i wychodzi efekt jakby rysowania lini pomiedzy A i B. tylko problem w tym ze moje wzorki z powyzszego postu cos nie chca dzialac.

 

W tej chwili jak opuznie rysuj to majac zbior A,B,C,D program bedzie rysowal w nastepujacy sposob:

 

rysuj linie opd A do B

opuznienie

rysuj linie od b do C

opuznienie

rysuj linie z C do D

opuznienie

rysuj linie z D do A

koniec prog.

Czyli beda sie pojawiac z opuznieniem kolejne linie otoczki.

 

Do rysowania uzywam np g.DrawLine(Pens.Black, 5, 54, 52, 54). Wiec aby opuznic musze wyliczac pkt miedzy A i B, chyba ze jakos inaczej sie da??

Edytowane przez hojrak6

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...