[ dava @ 23.03.2009. 11:02 ] @
Kako napraviti kontrolu koja bi se kretala po formi, ali da to kretanje opisuje krug ili elipsu?
[ bocy @ 23.03.2009. 12:56 ] @
Evo kako bih ja to uradio.

Recimo hoces textbox da se krece putanjom kruznice.

Textbox kontrola ima .Location koji odredjuje poziciju crtanja kontrole.

Odredi poluprecnik kruznice i odredi njen centar.

postavi npr timer koji ce menjati ugao kruznice od 0 do 359

Nakon toga preko sin i cos odredi tacan x i y koordinatu i to dodaj na centar kruznice

i promeni location kontrole i to ti je to :)
[ dava @ 23.03.2009. 13:53 ] @
Hvala na odgovoru, ali nisu mi jasni neki koraci pa ako mozes da mi posjasnis.

Citat:

postavi npr timer koji ce menjati ugao kruznice od 0 do 359

Nakon toga preko sin i cos odredi tacan x i y koordinatu i to dodaj na centar kruznice

[ bocy @ 23.03.2009. 16:05 ] @
Citat:
dava: Hvala na odgovoru, ali nisu mi jasni neki koraci pa ako mozes da mi posjasnis.


koristis sistemsku funkciju timer koju poseduje c#. Namestis da se aktivira svake 0.1 sekunde, odnosno 100ms npr.

Ugao kruznice ide od 0 do 360 stepeni, s tim da je ugao 360 isto sto i 0. Ali posto bi bilo davljenje, postavis da se ugao povecava za po 10 stepeni pri svakom startovanju funkcije koju timer izvrsava.

Osnovno iz matematike, racunas x i y koordinate x = r*cos(ugao), y=r*sin(ugao)

ako imas koordinate centra, onda samo dodajes x i y koje si dobio da bi dobilo lokaciju kontrole na obodu kruga



[ IvanBeograd @ 23.03.2009. 18:49 ] @
A sto ne probas sa WPF-om ?
[ sallle @ 23.03.2009. 20:46 ] @
ovo je vise tema za art of programming...
naci jeftin nacin za kruzenje objekta... svakako ako vec izracunamo sin nema potrebe da racunamo i cos , vec je verovatno jeftinije da korstimo pitagoru.

zatim, kad jednom izracunamo 36 tacaka, nema potrebe da ih iznova racunamo, vec je bolje da ih zveknemo u neku indexiranu strukturu...

a u sustini i ne moramo da racunamo (i ili drzimo) svih 36 tacaka, vec je dovoljno 9 tacaka, tj 1 kvadrant. (ostale simetrijom mozemo nadjemo).

u stvari, mozda je dovoljno samo pola kvadranta (i jopet simetrija)...

interesantna tema...

[ Vranac @ 24.03.2009. 06:02 ] @
To sto ti trazis se zove carousel control. Imas je u vecini control packova koji mogu da se nadju na trzistu (Telerik, DevXpress, ...), vecina je bazirana na WPF.
Malo googlanja i mozes da nadjes sta ti treba, ono na sta sam naleteo na brzaka je ovo 3D Carousel Control Source Code radjeno za .net 1.1 i 2.0, mozda ti pomogne
[ dava @ 24.03.2009. 07:39 ] @
@bocy uspio sam da dobijem elipsasto kretanje, ali mi izgleda malo iztrzano. Koristio sam ovaj kod:

Code:



    timerAnimShow.Tick += new EventHandler(ShowMe);
    timerAnimShow.Interval = 100;
    timerAnimShow.Enabled = true;
    timerAnimShow.Start();

        ...

    void ShowMe(object sender, EventArgs e)
    {
           if(bIsShowAnimating)
           {
                          ugao++;
                          if (ugao == 360) ugao = 1;

                          int dx = Convert.ToInt16((9 * Math.Cos(ugao) / 3));
                          int dy = Convert.ToInt16((3 * Math.Sin(ugao)) / 3);
                          this.Location = new Point(this.Location.X - dx, this.Location.Y - dy);
                
                    }

            }


Metoda ShowMe se izvrsi na svaki tick tajmera kojem je interval 100. Ako smanjim interval, objekat se prebrzo krece. Ovo djeljenje sa tri sam dodao kao bi kretanje izgledalo prirodnije.
@sallle nije ti losa ideja, samo sto ovim kodom ne mogu da dobijem 36 tacaka i zbog toga mi kretanje izgleda istrzano.

A WPF je?
[ bocy @ 24.03.2009. 08:28 ] @
Koristi ovo :)

Postavi timer na 50ms timer.inetrval(50);

postavi koordinate centra kruga na xp = 200; yp = 200; a xp i yp definisi kao int;

i ne mozes koristiti samo ugao, vec ga moras konvertovati u radijane

i imaces savrseno glatku animaciju

onda ti ostaje da se igras. umesto ugao++ koristi ugao += nekavrednost;

evo ti sve

e da, i ne pomeraj prozor, vec postavi npr neki label koji ces pomerati



Code:

                public System.Windows.Forms.Timer timerAnimShow;
        public int ugao = 0;
        public bool bIsShowAnimating = false;
        public int xp = 0;
        public int yp = 0;
        public int r = 100;
        public MainForm()
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();
            
            //
            // TODO: Add constructor code after the InitializeComponent() call.
            //
            
            bIsShowAnimating = true;
            
            xp = 200; yp = 200;
            timerAnimShow = new Timer();
            timerAnimShow.Tick += new EventHandler(ShowMe);
            timerAnimShow.Interval = 50;
            timerAnimShow.Enabled = true;
            timerAnimShow.Start();

        }
        
        void ShowMe(object sender, EventArgs e)
        {
               if(bIsShowAnimating)
               {
                  ugao++;
                  if (ugao == 360) ugao = 1;
                  int dx = Convert.ToInt16((r * Math.Cos((Math.PI * ugao) / 180)));
                  int dy = Convert.ToInt16((r * Math.Sin((Math.PI * ugao) / 180)));
                  label1.Location = new Point(xp + dx, yp + dy);
            }

        }

    }
[ Igor Gajic @ 24.03.2009. 08:31 ] @
Pazi ugao koji racuna Math.Cos je u radijanima i ugao se krece od 0 do 2*pi. Stoga tvoja podela nije dovoljno "fina" za glatko kretanje.

Pa bi kod trebao da bude:

Code:

        private void timer1_Tick(object sender, EventArgs e)
        {
            ugao = (++ugao) % 360;
            double xkoord = 300 + 200 * Math.Cos(2 * 3.14 * (double)ugao / 360.0d);
            double ykoord = 300 + 200 * Math.Sin(2 * 3.14 * (double)ugao / 360.0d);

            button1.Top = (int)xkoord;
            button1.Left = (int)ykoord;
        }



P.S. A ovo je tako "CPU intensive" izracunavanje da je potrebno kesiranje i zezanje ...
[ dava @ 24.03.2009. 13:38 ] @
Hvala ljudi sada radi kako treba.
@Igore, ako mislis na opterecenje procesora, mislim da nije toliko strasno, jer one dve formule za racunanje x i y kordinate nisu nista za procesor, na svakid 50 ms. I onako se procesor ubi od dosade dok mu ne dodje ponovo tikmer tick.
[ Igor Gajic @ 24.03.2009. 13:52 ] @
@dava
Primeti smajli na kraju te recenice...
[ dava @ 25.03.2009. 10:27 ] @
...aaa ok.