• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++/CLI] Wyrysowywanie wykresu funkcji

Object Storage Arubacloud
0 głosów
632 wizyt
pytanie zadane 27 października 2016 w C i C++ przez Piotr Królak Obywatel (1,950 p.)

Witam, kończę projekt graficznego kalkulatora i został mi problem wyrysowywania wykresów, miałem pomysł żeby rysować go linią ale niestety kiedy kompiluję program i dochodzę do wyrysowywania wykresu to program zawiesza mi się, na początku myślałem że chodzi o to że miałem za dużo punktów, zmniejszyłem do 9 lini na okres sinusa, potem dodałem jeszcze opóźnienie...Niestety w dalszym ciągu problem pozostaje bez zmian. Poniżej zamieszczam kod dla akcji przyciśnięcia "sin" który jest odpowiedzialny za liczenie wartości i wyrysowywanie wykresu, będę wdzięczny za każdą pomoc! :)

private: System::Void butSin_Click(System::Object^  sender, System::EventArgs^  e) 
		 {
			 //sin
			 double b = Double::Parse(txtDisplay -> Text);
			 b = (b*3.1415)/180;
			 label -> Text = System::Convert::ToString("sin " + "(" + (txtDisplay -> Text) + ")" );
			 b = Math::Sin(b);
			 txtDisplay -> Text = System::Convert::ToString(b);

			 //plot!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
			 PK_calculator::Height = 663;
			 
			 double yy =0;
			 double xx =0;

			 double xxx = 14;
			 double yyy = 517;

			 for(xx=0;xx<360;xx+=40)
			 {
				xx = (xx*3.1415)/180;

				yy = Math::Sin(xx);

				xx+=14;
				yy=617-(100*yy);

				//linia wykresu
				plot->X1 = xxx;
				plot->X2 = xx;
				plot->Y1 = yyy;
				plot->Y2 = yy;

				xxx=xx;
				yyy=yy;

				//Sleep(1000); //zatrzymanie programu na t milisekund
			 }
			 
		 }

 

1 odpowiedź

0 głosów
odpowiedź 27 października 2016 przez obl Maniak (51,280 p.)
wybrane 27 października 2016 przez Piotr Królak
 
Najlepsza

W twoim kodzie nie ma niczego, co mogłoby wskazywać na rysowanie linii. Ten fragment:

                plot->X1 = xxx;
                plot->X2 = xx;
                plot->Y1 = yyy;
                plot->Y2 = yy;

to tylko ustawienie pól jakiegoś obiektu klasy. Nie wywołujesz tutaj żadnej metody rysującej.

Kolejna kwestia jest taka, że ten kod raczej nie powinien stwarzać problemów. Na twoim miejscu bym debugował ten program krok po kroku aż dojdziesz do miejsca, gdzie się zawiesza. I wtedy będzie można się zastanawiać dlaczego w tym miejscu tak się dzieje. W takim przypadku ciężko niestety będzie komuś z zewnątrz odpowiedzieć ci dlaczego nie działa.

W Visual Studio wystarczy ustawić tryb kompilacji na debug i w kodzie po lewej stronie tam gdzie jest numeracja linijek kodu można kliknąć i wstawić punkt przerwania. Jak odpalisz program i wywołanie tego kawałka kodu spowodujesz to program się w tym punkcie zatrzyma i klikając F10 powoli, linijka po linijce debugujesz aż dojedziesz do momentu, że program się zawiesi.Wtedy będziesz wiedział gdzie a to ułatwi znalezienie odpowiedzi dlaczego.

komentarz 27 października 2016 przez Piotr Królak Obywatel (1,950 p.)
debugowałem i wszystko jest niby ok, co nie zmienia faktu że okienko sie zawiesza...Chciałem tu wykorzystać bezwładność oka i zapętlić linie która jest właśnie tym obiektem którego zmieniam położenie.

Znacie może jakieś miejsce gdzie w prosty i przejrzysty sposób można dowiedzieć się o rysowaniu w pictureboxie?  w c++/cli?

Wiem że trzeba utworzyć pen nadaćmu kolor i dopiero użyć DrowLine() ale nie znalazłem przykładów które by mi się kompilowały po zmianach...
komentarz 27 października 2016 przez obl Maniak (51,280 p.)

Powiem ci szczerze, że od dawna nie pisałem w tym bo to jakieś dziwaczne jest niby C++ ale nie C++. Żeby rysować w pictureBox-ie musisz podpiąć się pod zdarzenie z nim związane Paint i tam robisz coś takiego:

	private: System::Void pictureBox1_Paint(System::Object^  sender, System::Windows::Forms::PaintEventArgs^  e) {
				 System::Drawing::Pen pen(System::Drawing::Color::FromArgb(0,200,100), 1.f); // pędzel tworzysz
				 e->Graphics->DrawLine(%pen, 0.f, 0.f, 10.f,10.f); // rysujesz upragnioną linię
			 }
	};

 

komentarz 27 października 2016 przez Piotr Królak Obywatel (1,950 p.)
Zdaje się ze w muszę dodać przestrzeń nazw do rysowania?

Niestety nie rozumiem kiedy zdarzenie "Paint" jest aktywne, i jak takie zdażenie podpiąć żeby po przyciśnięciu buttona rysowało?
 

Widziałem wiele opini że CLI to nieporozumienie, niestety projekt muszę wykonać w CLI. Rozważam naukę C# na przyszłość ale puki co nie znam nawet składni, podczas kiedy czyste  C++znam dobrze(głównie na mikrokontrolery).
komentarz 27 października 2016 przez obl Maniak (51,280 p.)

Ciężko będzie wytłumaczyć tutaj, ale jeżeli masz obiekt pictureBox-a to poprzez wywołanie jego metody Refresh (odśwież) wywołujesz zdarzenie podpięte pod to związane z odrysowaniem. Wygląda to mniej więcej tak:

this->pictureBox1->Refresh();

Nie wiem tylko, czy wiesz jak podpiąć się pod zdarzenie. To się robi w trybie graficznym zaznaczasz kontrolkę pictureBoxa na formie i w okno właściwości wchodzisz tam jest taka ikonka w kształcie błyskawicy klikasz to i pojawia ci się lista zdarzeń związanych z tą kontrolką, ty musisz znaleźć Paint, klikasz na to dwa razy i podpięte masz zdarzenie a dalej to tak jak powyżej (mniej więcej) to powinno wyglądać.

komentarz 27 października 2016 przez Piotr Królak Obywatel (1,950 p.)

Wielkie dzięki!

Jeszcze tylko ostatnie pytanie.

e->Graphics->DrawLine(%pen, 0.f, 0.f, 10.f,10.f);

rozumiem że 0.f to współżędne odpowiednio X1,X2,Y1,Y2 ale co oznacza ".f"?

Wiem jak oprogramować zdarzenia ale nie wiedzałem jak wywołać zdażenie paint, no i oczywiście co w nim wpisać, poza ogólnymi informacjami. 

Myślę że sobie poradzę, jeszcze raz dziękuję! :)

komentarz 27 października 2016 przez obl Maniak (51,280 p.)

Tak, 0.f oznacza że to jest liczba typu float, masz pierwszy argument to twój pędzel, drugi to x1, później y1, x2, y2

komentarz 27 października 2016 przez Piotr Królak Obywatel (1,950 p.)
a czy za 0.f moge wpisać zmienną np x tkórą wcześniej utworze? czy mam ją zapisać x.f?
komentarz 28 października 2016 przez obl Maniak (51,280 p.)

0.f jest oznaczeniem dla literałów, jeżeli masz zmienną typu float to bez problemu możesz jej użyć, jeżeli typu int albo double to musisz rzutować tak: (float) x

float x1 = 0;
float y1 = 5;
int x2 = 20;
int y2 = 30;
e->Graphics->DrawLine(%pen, x1, x1, (float)x2,(float) y2);

 

Podobne pytania

0 głosów
2 odpowiedzi 254 wizyt
0 głosów
1 odpowiedź 139 wizyt
pytanie zadane 2 listopada 2016 w C i C++ przez Piotr Królak Obywatel (1,950 p.)
0 głosów
1 odpowiedź 121 wizyt
pytanie zadane 27 sierpnia 2023 w C i C++ przez Code_ Użytkownik (520 p.)

92,572 zapytań

141,422 odpowiedzi

319,645 komentarzy

61,959 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...