[ dava @ 23.03.2009. 11:02 ] @
Kako napraviti kontrolu koja bi se kretala po formi, ali da to kretanje opisuje krug ili elipsu? |
[ dava @ 23.03.2009. 11:02 ] @
[ 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.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|