Rotirea unei linii C#
11De 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.
Daca acest articol contine o greseala, selecteaza cuvintele sau fraza gresita si tasteaza combinatia de taste Shift + Enter sau apasa click aici pentru a o raporta. Multumim!
tare ,ce bataie de cap mi-a dat si la judeteana si la nationala:)))
problema era foarte simpluta 😉 o sa postez in curand sin/cos de anul acesta.
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
ma voi sunteti buni rau …. nu altceva
dar tabla inmultirii o stiti?
mi’a placut :))))
Ontopic please 😐
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 ]
cu 90 de grade… am uitat sa specific 🙂
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.
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];
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 .. ?