C++ builder rysowanie sinusoidy i f.Kwadratowej


(Kamyk9944) #1

Witam. Mam do zrobienia program który po wczytaniu zmiennych narysuje sinusoidę. Zupelnie nie wiem jak się za to zabrać. mam p i q i jak tego użyć? jak wiemy wzór to sin(x-p)+q. jak by ktoś pomógł rozkminić co robić po kolei lub ma kod było by super bo jest to dla mnie ważne. Potrzebuję też f. kwadratowej. Co prawda niby działa, ale rysuje nie zbyt dobrze. Bardziej zależy mi na sinusoidzie, także jak ktos ma kod/pomysł to bardzo proszę. To nie jest tak że nie próbowałem i proszę o gotowca, bo głowię się z tym od paru dni i nic nie wychodzi. Pozdrawiam! (dodam ze wykres rysuje w PaintBox)


([alex]) #2

Przecież masz komponent TChart !


(Kamyk9944) #3

ale chodzi o to ze my go w szkole na lekcji nie bralismy, nie wiem jak dziala, a bardzo duzo programu mam zrobione pod Paint Boxa. Posluguje sie funkcjami MoveTo i LineTo. ale nie wiem jak narysowac sinusoide i kwadratówke. Jestem początkujący z Okienek w c++ dlatego proszę o pomoc.


([alex]) #4

to czego nie potrafisz:

for(int x=0;x
  {

   int y=ToPixel(Ymax,Ymin,PaintBox->Height,function(ToValue(Xmax,Xmin,PaintBox->Width,x)));

   if(x) PaintBox->Canvas->LineTo(x,y);

   else PaintBox->Canvas->MoveTo(x,y);

  }

funkcji ToPixel() i ToValue() na zasadzie: Konwersja z zakresu Amin … Amax na Bmin … Bmax

B=(Bmax*(A-Amin)+Bmin*(Amax-A))/(Amax-Amin)

(Kamyk9944) #5

a co moze byc zle w tym rysowaniu kwadratówki?

funkcja rysuje parabole, ale punkty się nie zgadzają, sprawdzałem z innym programem i któryś z punktów się zgadza, a któryś jest zły. Kod w zasadzie po części pisany przez kolegę (przekszatałcony po wykresie f.liniowej która działa dobrze). lewo to PaintBox1->Left, dol i prawo analogicznie ( sa to skrajne punkty PaintBoxa) a “b” sobie dałem *15 bo wykres się przesuwa w pikselach i jak dam np b=2 to to będzie praktycznie nie widoczne.

prawo to paintBox1->Width. a,b,c to Edity i ich zawartości (Edit1->Text). Jak możesz sprawdź u siebie, może się połapiesz i dasz radę pomóc :slight_smile: Aha, usuń tą linijkę b=b*15 jak będziesz sprawdzał, bo ona nie potrzebnie zwiększa wykres i nic nie widać. Co do sinuski którą podałeś, nie bardzo rozumiem ale dzięki za fatygę, jakoś się z nią uporam. bardzoiej chyba już mi zależy na kwadratówce

int y;

b=b*15;


PaintBox1->Canvas->MoveTo(srodek_x-lewo,srodek_y-(a*pow(-lewo,2)+b*(-lewo)+c)); ////////RYSOWANIE WYKRESU

for(int x=-dol;x
        y=a*pow(x,2)+b*x+c;      

        PaintBox1->Canvas->LineTo(srodek_x+x,srodek_y-y);

        PaintBox1->Canvas->MoveTo(srodek_x+x,srodek_y-y);

([alex]) #6
for(int x=-lewo;x

(Kamyk9944) #7

mialem tak wczesniej chyba, ale to rysuje polowe paraboli i dalej zle :/. kurde spory problem z tym mam


([alex]) #8

to zrób tak jak napisałem wyżej.


(Kamyk9944) #9

no tak mam i zle jest. ;/


([alex]) #10

TAK?

for(int x=0;x
  {

   int y=ToPixel(Ymax,Ymin,PaintBox->Height,function(ToValue(Xmax,Xmin,PaintBox->Width,x)));

   if(x) PaintBox->Canvas->LineTo(x,y);

   else PaintBox->Canvas->MoveTo(x,y);

  }

Nie chrzań.


(Kamyk9944) #11

a, o to chodzi. Ale progtam nie wie co to function, ToPixel, toValue. Rozumiem ze Xmax to prawa strona paintboxa, Xmin to lewa, Ymax go góra a ymin to dół. Sam jakoś nie za bardzo orientuje się co to może być bo jak wspominałem dopiero niedawno zaczeliśmy zabawy w okienkach.

#EDIT wlasnie sprawdzalem moja kwadratowke z wykresem google. po duzym oddaleniu tej z google wyglada tak samo jak moja. Pozostaje mi jedynie przeskalowac moj wykres aby byl wiekszy ale jak.


([alex]) #12

Oczywiście nie wie co to function() bo masz napisać:

double function(double x) { return x*x; }

ToPixel, ToValue - funkcje zajmujące się skalowaniem:

int ToPixel(double Amax,double Amin,int Bmax,double A)

  {

   return (int)(0.5+Bmax*(A-Amin)/(Amax-Amin)); // skracamy bo Bmin=0;

  }

double ToValue(double Bmax,double Bmin,int Amax,int A)

  {

   return (Bmax*A+Bmin*(Amax-A))/Amax; // skracamy bo Amin=0;

  }

(Kamyk9944) #13

Dobra, uporałem się z tym wszystkim ale mam problem w rysowaniu. W logarytmie jak wpiszę wartosc i klikne narysuj to najpierw wywala blad Log sing error, a po kliknieciu OK rysuje wykres.

druga sprawa to funkcja wykladnicza. Im wieksze “a” podam tym wiecej tych kresek po prawej stronie. sam wykres rysuje sie dobrze ale te kreski bardzo nie ladnie wygladaja. http://i36.tinypic.com/os7in4.jpg


([alex]) #14

“blad Log sing error” - a debugier to ci ufoludki zaiwanili?

“ale te kreski bardzo nie ladnie” - a kreski też logarytmicznie rysować (1,10,100,1000) - nie laska?