Ruch obiektu po okręgu

0

Witam

Napisałem sobie programik w którym kółeczko krąży po obwodzie okręgu. Wszystko działa w timerze z odświeżaniem co 1ms. Problemem jest, to że ruch musi być jak najdokładniejszy (czyt. skok o jak najmniejszą liczbę radianów) i jak najszybszy. Zawiesiłem się nieco bo czym większą dam dokładność czym bardziej ruch zwalnia, a przy dużym skoku obiekt skacze po obwodzie, a chodzi o to by zaliczył jak najwięcej współrzędnych.

Ma może ktoś pomysł na to, jak to zrealizować?

Pozdrawiam

0

Tak będzie zawsze, bo interwał timer'a jest taki sam, a dokładość zmniejszasz czyli będzie wolniej. Trzeba by zmniejszyć jeszcze interwał timer'a, ale już mniej się nie da z tego co wiem. Może by w pętlę dać w oddzielny wątek?

0

Nie mogę edytować posta, więc dorzucam kod tutaj:

public void timer1_Tick(object sender, EventArgs e)
        {
            label1.Text = DateTime.Now.ToLongTimeString() + "," + DateTime.Now.ToLongDateString();
            i = i + 0.01;
            
                //0.05654866776461627829232758089903;
             //pictureBox1.Refresh();

             for (j = 0; j <= 50; j = j + 15)
             {
                 x = Math.Round(Math.Sin(i) * (90)) + 120;
                 y = Math.Round(Math.Cos(i) * (90)) + 120;

                 x1=Math.Round(Math.Sin(i) * (90)) + 20;
                 y1 = Math.Round(Math.Cos(i) * (90)) + 20;

                 Dioda d1 = new Dioda(pictureBox1, Convert.ToInt32(x), Convert.ToInt32(y), x, y, i);
                 Dioda d2 = new Dioda(pictureBox1, Convert.ToInt32(x), Convert.ToInt32(y), x1, y1, i);

             }
              label2.Text = Convert.ToString(x);
              label3.Text = Convert.ToString(y);

              if (x == 30 )
              {
                  k = k + 1;
                  
              }
              label4.Text = Convert.ToString(k);
} 
public Dioda(System.Windows.Forms.PictureBox _symulacjaPictureBox, int _Width, int _Height, double x, double y, double i,int g)
        {

            System.Drawing.Graphics grfx = _symulacjaPictureBox.CreateGraphics();
            Pen pen = new Pen(Color.Red, g);




            grfx.DrawEllipse(pen, Convert.ToInt32(x), Convert.ToInt32(y - 4), 5, 5);
            // Draw line to screen.
            

            // ...



        } 

@xeo545x39 wiem co jest powodem problemu, tylko nie wiem jak go rozwiązać :)

0

Przobiłem na C#.
X2 = Math.Ceiling(X + Odl * Math.Sin(angle / 180 * Math.Pi));
Y2 = Math.Ceiling(Y + Odl * Math.Cos(angle / 180 * Math.Pi));

if (angle < 360) angle += 1;
else angle = 0;

Gdzie Angle to kąt (Int), Odl to promień okręgu (Int), X i Y to współrzędne środka okręgu po którym przemieszcza się B (X2 i Y2).
0

Ja bym raczej pokombinował z rysowaniem na obiekcie Bitmap czy nawet BitmapData, a potem dopiero wyświetlał go w PictureBox.

0

@somekind: To ma być chyba rysowane na bieżąco. Czy jest sens rysować na bitmapie i i tak ją odświeżać co chwilkę?

0
Anonim1024 napisał(a)

@somekind: To ma być chyba rysowane na bieżąco. Czy jest sens rysować na bitmapie i i tak ją odświeżać co chwilkę?

Graphics jest dość niewydajny, IMHO Bitmapa, a zwłaszcza BitmapData byłaby szybsza.

0

@TomRiddle niestety dalej to samo. Niby szybciej się obraca, ale dalej pozostaje problem skoku. Żeby przyśpieszyć obrót, muszę zwiększyć sumowanie i w pętli, a to powoduje większy skok i wychodzi niemal na jedno.

0

Nie wiem czemu nie działa. Ja to wsadziłem do Timer'a (Interval 10), bez żadnej pętli i jakoś działa. Może chodzi o to że program się przycina bo nie jest w stanie tak szybko wyświetlić tej bitmapy (ja to robiłem z pozycją kursora myszy).

Ja bym nie używał pętli do tego, tylko starał się wybrać optymalny Interval.

0

No widzisz nie rozumiemy się. Nie mówię, że to nie działa, tylko, że nie ma takiej prędkości jak trzeba.
Chcę uzyskać 5400 obrotów na minutę przy jak największej dokładności. Gdyby elipsa obracała się o 1 stopień byłoby super. Na chwilę obecną mam ustawiony interwał na 1ms i skok reguluję poprzez zwiększanie i. Tyle, że przy i w granicach 1 skok jest dość duży, to samo nawet przy 0.1, fajnie by było przy 0.01, ale wtedy obroty są małe.

0

Raczej, kurcze, mało prawdopodobne bo skok o 1 stopień zająłby 0.003ms.

Ale wcale nie musisz robić skoku o 1 stopień, żeby było jak najdokładniej. Bo za każdym razem będzie 360 skoków. Jeżeli przykładowo promień ma 5pixeli, to możliwych ustawień elipsy wzgl. środka będzie mniej bo jakieś 30-40, a to lekka różnica (szybciej x12). Więc lepiej sobie podzielić 360 przez ilość takich możliwych punktów i rób skoki o tyle ile Ci wyjdzie. Dokładność będzie taka sama, a szybkość będzie większa.

Możesz też zrobić inaczej. Na starcie programu robisz test, ile zajmie wykonanie instrukcji if ((3+4) == 6) then Bool = !Bool;
else {cos tam}

 i zrobić pętle w wątku, która zrobi to z tym obrotem i wykonać powyższą funkcję tyle razy żeby stykło akurat na 0.003ms.
0

@TomRiddle nie czaję :/
Mnie się w obecnej chwili mózg zamknął na tym, że max interwał timera wynosi 1ms, więc mogę maksymalnie skoczyć o x stopni w tym czasie. To niby daje 1000 stopni na s, co w przybliżeniu daje 32s na 5400 obrotów - dużo za mało :/
Nie mogę tego opierać o promień okręgu po którym będzie się elipsa obracać, bo elips ma być x w różnej odległości od środka.

Pewnie dużo pomoże, opis tego co chcę zrobić. I ewentualnie rozwieją się moje wątpliwości względem pewnego zagadnienia. Każdy z was pewnie wie co to jest wyświetlacz widmowy, mnie chodzi o odwzorowanie jego działania na ekranie komputera. Jednym słowem tworzę sobie 16-32 diody ułożone w jednej linii i obracam je z prędkością 5400obr/min. Tyle jeśli chodzi o same fakty. Nie wiem jednak czy uzyskam na ekranie efekt "rozmazania" diody, czyli podstawę działania tego wyświetlacza. Wstępnie pewne rozmycie wychodzi, a obroty przecież nie są duże, no i dokładność mała.

1

IMHO, to WinFormsy nie są dobrą technologią do tworzenia czegoś takiego.

0

Prawie-jak-off-topic: jak chcesz zanimować 5400 obrotów na minutę? Przecież to 90 obrotów na sekundę - nie będzie nic widać. Gdyby to było 5400obr./h, (1,5/s), to OK...

1 użytkowników online, w tym zalogowanych: 0, gości: 1