• Acasă
  • Despre noi
  • Autori
  • Mărturii
  • Arhivă
  • Trimite Articol
  • Contact

WORLDIT

Lumea în 1 și 0.

  • Știri
    • Tehnologie
    • Tehnologie mobilă
    • Securitate
    • Developers
    • Știință
    • Benzi desenate
    • Jocuri
    • Intern
  • Tehnic
    • Browser
    • C#
    • C/C++
    • Challenge
    • HTML/CSS
    • Javascript, Ajax, jQuery
    • Open Source
    • PHP
    • Python
    • Securitate IT
    • Socializare
    • WordPress
    • Altele
  • Recenzii
  • Interviuri
  • Evenimente

Rotirea unei linii C#

11
  • Publicat de Cornescu Andrey
  • în C# · C/C++ · Tehnic
  • — 26 mai, 2010 at 9:09 pm

De curand am rezolvat o problema care imi cerea sa rotesc o linie in jurul unui punct (subiectul de la C.I.A 2009 daca va mai aduceti aminte). Spre surprinderea mea rezolvarea problemei era foarte simpla fiind aplicata doar doua functii matematice Sinus si Cosinus cu care am calculat coordonatele punctelor.

public partial class Rotate : Form
    {
        public Bitmap image;
        public Graphics gra;

        public int angle = 10;
        public int step = 0;
        public int radius = 150;

        public System.Timers.Timer timer;

        public Rotate()
        {
            InitializeComponent();

            image = new Bitmap(400, 300);
            gra = Graphics.FromImage(image);

            gra.Clear(Color.DarkBlue);
            pictureBox1.Image = image;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (timer == null)
            {
                timer = new System.Timers.Timer(50);
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);

                timer.Start();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (timer != null)
            {
                timer.Stop();
                timer = null;
            }
        }

        void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            gra.Clear(Color.DarkBlue);

            PointF point1 = new PointF(200, 150);
            PointF point2 = new PointF();

            point2.X = radius * (float)Math.Cos(DegreesToRadians(angle * step)) + 200;
            point2.Y = radius * (float)Math.Sin(DegreesToRadians(angle * step)) + 150;
            gra.DrawLine(new Pen(Color.White), point1, point2);
            step++;

            pictureBox1.Image = image;
        }

        private double DegreesToRadians(double angle)
        {
            return angle * Math.PI / 180.0;
        }
    }

Explicarea codului:

        public Bitmap image;
        public Graphics gra;

        public int angle = 10;
        public int step = 0;
        public int radius = 150;

        public System.Timers.Timer timer;

       public Rotate()
        {
           InitializeComponent();
           image = new Bitmap(400, 300)
           gra = Graphics.FromImage(image);
           gra.Clear(Color.DarkBlue);
           pictureBox1.Image = image;
       }

Pentru inceput am initializat 2 variable angle si step care inmultite vor da unghiu cu care linia trebuie rotitata, un step de 36 va rezulta intr’o rotire completa a linii (10 * 36 = 360 grade), in constructorul clasei am initializat imaginea propriu zisa si am setat backgroundu la culoarea DarkBlue.

            gra.Clear(Color.DarkBlue);

            PointF point1 = new PointF(200, 150);
            PointF point2 = new PointF();

            point2.X = radius * (float)Math.Cos(DegreesToRadians(angle * step)) + 200;
            point2.Y = radius * (float)Math.Sin(DegreesToRadians(angle * step)) + 150;
            gra.DrawLine(new Pen(Color.White), point1, point2);
            step++;

Observam ca folosim functia DegreesToRadians pentru a asigura parametrul functiei sin/cos asta deoarce acesta ia valoare in radieni si nu in grade. Cifrele adaugate la sfarsit ( + 200/ 150 ) reprezinta ‘offsetu’ de la care a inceput primul punct, acestea fiind necesare pentru calcularea corecta a punctelor (obtinem niste efecte destul de interesante daca scoatem un offseturile :))

Puteti descarca proiectul complet aici.

Articol original Area72.

Etichete: calculare puncteconstructorcosinuscsharp rotirerotire c#rotire liniesinus

— Cornescu Andrey a scris 6 articole

Contact | office@area72.ro | @twitter Fondator Area72, numele meu este Cornescu Andrei si lucrez in domeniul informaticii de aproximativ 3 ani, pasionat de ceea ce fac si mai ales dornic sa invat› dar si sa impartasesc din cunostintele mele. De asemenea deschis la intrebari si provocari :)

  • Articolul anterior Un nou tip de phishing vizeaza taburile din browser
  • Articolul următor Un cercetator sa infecteaza cu un virus de computer

11 Comentarii

  1. razvan spune:
    mai 26, 2010 la 11:06 pm

    tare ,ce bataie de cap mi-a dat si la judeteana si la nationala:)))

  2. Cornescu Andrey spune:
    mai 27, 2010 la 3:23 pm

    problema era foarte simpluta 😉 o sa postez in curand sin/cos de anul acesta.

  3. concept w spune:
    iunie 1, 2010 la 6:17 pm

    Foarte simplu. Cu sin si cos am reusit sa rotesc pe X, Y, Z, o matrice 3D in pascal, acum mai bine de 14 ani. Am rescris algoritmul in flash, e pe site la mine. Am dezvoltat o serie de scripturi cu care se pot genera obiecte primitive; cub, sfera, tor, con, piramida, prisma n, … cand o sa am ceva timp liber, le voi afisa pe toate pe site

  4. batman spune:
    iunie 3, 2010 la 12:22 am

    ma voi sunteti buni rau …. nu altceva

    dar tabla inmultirii o stiti?

  5. Cornescu Andrey spune:
    iunie 3, 2010 la 12:23 am

    mi’a placut :))))

  6. Grigore Ciprian spune:
    iunie 13, 2010 la 1:21 am

    Ontopic please 😐

  7. catalin spune:
    iunie 13, 2010 la 2:22 pm

    Puteti sa ma ajutati cu un algoritm care sa imi roteasca o matrice patratica in sensula acelor de ceas?

    Ex:

    [ 1, 1 ] [ 1, 2 ] [ 1, 3 ]

    [ 2, 1 ] [ 2, 2 ] [ 2, 3 ]

    [ 3, 1 ] [ 3, 2 ] [ 3, 3 ]

    va deveni

    [ 3, 1 ] [ 2, 1 ] [ 1, 1 ]

    [ 3, 2 ] [ 2, 2 ] [ 1, 2 ]

    [ 3, 3 ] [ 2, 3 ] [ 1, 3 ]

  8. catalin spune:
    iunie 13, 2010 la 2:28 pm

    cu 90 de grade… am uitat sa specific 🙂

  9. Cornescu Andrey spune:
    iunie 13, 2010 la 5:26 pm

    creezi o a doua matrice in care generezi matricea noua in 4 pasi (copii elementele de pe linia 1 pui pe coloana 3 etc…), pentru o matrice mai mare decat 3×3 faci algoritmul pentru intervalul interior de elemente.

  10. catalin spune:
    iunie 13, 2010 la 5:30 pm

    am facut singur un algoritm … multumesc oricum… il voi posta aici( poate mai are cineva nevoie de el)

    // citire matrice patratica
    f>>n;
    for(i=1; i<=n; i++)
    {
    for(j=1; j>a[i][j];
    }
    //copiere matrice
    for(i=1; i<=n; i++)
    for(j=1; j<=n; j++)
    b[i][j]=a[i][j];

    // rotire dreapta

    for(i=1; i<=n; i++)
    for(j=1; j<=n; j++)
    a[i][j]=b[n-j+1][i];

    // rotire stanga

    for(i=1; i<=n; i++)
    for(j=1; j<=n; j++)
    a[i][j]=b[j][n-i+1];

  11. Diana spune:
    ianuarie 22, 2012 la 2:00 pm

    Cine poate sa ma ajute la o problema care suna in felul urmator : sa sa afiseze matricea rasturnata si o cerinta : sa se afiseze matricea vazuta in oglinda .. ?


  • Facebook

    WorldIT.info
  • Ultimele Atacuri Cibernetice din Romania – RO Hacked

    [wp_rss_retriever url="https://rohacked.bit-sentinel.com/feed/" excerpt="none" items="5" read_more="false" new_window="true" thumbnail="false" cache="0"] RO Hacked este registrul atacurilor cibernetice din România.
  • Caută

  • Articole Recomandate

    • Recent Posts
    • Tags
    • Număr record de participanți la DefCamp 2015, cel mai important eveniment dedicat securității cibernetice din Europe Centrala si de Estdecembrie 2, 2015
    • La DefCamp 2015 vei afla prin ce tehnici pot fi evitate măsurile de securitate ale sistemelor informatice criticeoctombrie 16, 2015
    • Ultima sansa sa rezervi bilete de tip Early Bird la DefCamp 2015septembrie 1, 2015
    • 15 sfaturi despre cum poti deveni un programator bun venite de la specialisti romaniaugust 4, 2015
    • algoritmica Android antivirus Apple Avadanei Andrei benzi desenate BitDefender blog browser C++ Chrome concurs eveniment Facebook Firefox Google google chrome hacking html5 infografic informatica internet Internet Explorer IT javascript linux Microsoft Mozilla Firefox online PHP programare retea sociala review Romania securitate Tehnologie Twitter web Windows Windows 7 Wordpress WorldIT worldit.info Yahoo! YouTube
  • aprilie 2021
    L Ma Mi J V S D
     1234
    567891011
    12131415161718
    19202122232425
    2627282930  
    « dec.    
  • Link-uri Sponsorizate

    • laptop second hand

    • Calculatoare Second Hand

    • cod voucher pc garage

  • Home
  • Tehnic
  • C#
  • Rotirea unei linii C#
  • Important

    • Bit Sentinel
    • Centrul de Cercetare în Securitate Informatică din România
    • DefCamp
  • Prieteni

    • BetiT.ro
    • bijuterii handmade
    • Computerica | Resurse gratuite PC
    • Descopera.org
    • Gadgeturi si IT – Giz.ro
  • Prieteni

    • PC – Config
    • RO Hacked
    • Stiri IT

Copyright © 2009-2014 WORLDIT. Toate drepturile Rezervate.
Termeni și condiții | Contact | Licența Creative Commons