Principales respuestas
Mover punto en el pictureBox

Pregunta
-
Hola:
Hace siglos que quice hacerlo pero no me salió. añado en el Windows Form un pictureBox, ahí dentro creo dos rayas, una vertical y otra horizontal con el círculo en medio, tal como indica la imagen de abajo.
Los puntos que muestran se tiene que mover tal como lo hace en el vídeo de abajo.
¿Alguna idea?
Saludos.
http://electronica-pic.blogspot.com
Respuestas
-
Bueno
Ya arreglé lo de que la x del círculo sea la x de la linea horizontal y la y del círculo sea la y de la linea vertical.
Igual antes se movía, lo que te pasó es que no asignaste el método del evento Load, donde se activa el Timer.
Asegurate de asignar los 3 métodos a sus eventos, para que te funcione, Form1_Load, pictureBox1_Paint, y timer1_Tick.
using System; using System.Drawing; using System.Windows.Forms; namespace WindowsFormsAppCircleAndPoints { public partial class Form1 : Form { private int pt1a = 0; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { timer1.Start(); } private void pictureBox1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; int ptx, pty; g.Clear(Color.White); g.DrawEllipse(Pens.Black, new Rectangle(40, 40, 300, 300)); g.DrawLine(Pens.Black, 20, 40, 20, 340); g.DrawLine(Pens.Black, 40, 360, 340, 360); ptx = (int)(Math.Cos((double)pt1a*Math.PI / 180.0) * 150.0); pty = (int)(Math.Sin((double)pt1a*Math.PI / 180.0) * 150.0); g.FillEllipse(Brushes.Black, new Rectangle(190 + ptx - 5, 190 - pty - 5, 11, 11)); g.FillEllipse(Brushes.Black, new Rectangle(15, 190 - pty - 5, 11, 11)); g.FillEllipse(Brushes.Black, new Rectangle(190 + ptx - 5, 355, 11, 11)); } private void timer1_Tick(object sender, EventArgs e) { pt1a += 2; if (pt1a >= 360) pt1a -= 360; pictureBox1.Invalidate(); } } }
- Marcado como respuesta Metaconta sábado, 1 de agosto de 2020 1:56
-
Buen día
Si, se puede.
Podes asignar al Text del label al final del método del evento Paint.
Si queres poner las coordenadas del punto, es:
x = 190 + ptx
y = 190 - pty
El ángulo es pt1a
- Marcado como respuesta Metaconta sábado, 1 de agosto de 2020 14:01
-
Lo hice así que se sume de a 2 y con 50 FPS (o sea, Interval a 20) y la velocidad quedó bien. Se va sumando el ángulo hasta que llega a 360 y luego empieza de 0 otra vez. Si hubiera sumado de a 1 se vería a la mitad de velocidad y si hubiera sumado de a 4 se vería al doble de velocidad. Salvo que cambie el Interval, cuanto menor es éste, mayor es la velocidad.
Por ejemplo, si sumo de a 1 en vez de 2 y con Interval a 10 en lugar de 20, se vería a igual velocidad pero con mayor precisión.
Saludos
- Marcado como respuesta Metaconta lunes, 3 de agosto de 2020 12:26
Todas las respuestas
-
Pero ¿en qué parte te has atascado? ¿No sabes hacer el dibujo con GDI+? ¿No sabes como pasarlo al PictureBox? ¿No sabes cómo dispararlo periódicamente con un Timer? ¿No sabes hacer los cálculos matemáticos para calcular las coordenadas del punto? ¿Dónde exactamente te has atascado, cuál es la parte que no te sale?
-
Hola Metaconta,
Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te comento que para que la comunidad de foros te pueda asesorar mejor, es necesario que formules una pregunta específica y clara.
Gracias por usar los foros de MSDN.
Eric Ruiz
____________________________
Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.
Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.
-
Hola Metaconta
Con las funciones trigonométricas (o circulares) Cos() y Sin() se obtienen las (x, y) del punto en la circunferencia, los de las lineas sólo se modifican la y del vertical y la x del horizontal.
using System; using System.Drawing; using System.Windows.Forms; namespace WindowsFormsAppCircleAndPoints { public partial class Form1 : Form { private int pt1a = 0, pt2y = 300, pt2s = -1, pt3x = 80, pt3s = 1; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { timer1.Start(); } private void pictureBox1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; int ptx, pty; g.Clear(Color.White); g.DrawEllipse(Pens.Black, new Rectangle(40, 40, 300, 300)); g.DrawLine(Pens.Black, 20, 40, 20, 340); g.DrawLine(Pens.Black, 40, 360, 340, 360); ptx = (int)(Math.Cos((double)pt1a*Math.PI / 180.0) * 150.0); pty = (int)(Math.Sin((double)pt1a*Math.PI / 180.0) * 150.0); g.FillEllipse(Brushes.Black, new Rectangle(190 + ptx - 5, 190 - pty - 5, 11, 11)); g.FillEllipse(Brushes.Black, new Rectangle(15, pt2y - 5, 11, 11)); g.FillEllipse(Brushes.Black, new Rectangle(pt3x - 5, 355, 11, 11)); } private void timer1_Tick(object sender, EventArgs e) { pt1a += 2; if (pt1a >= 360) pt1a -= 360; pt2y += 4 * pt2s; if (pt2y <= 40 || pt2y >= 340) pt2s = -pt2s; pt3x += 4 * pt3s; if (pt3x <= 40 || pt3x >= 340) pt3s = -pt3s; pictureBox1.Invalidate(); } } }
El Interval de timer1 es 20 y da una velocidad parecida a la del video.
Saludos
Pablo
- Editado Tigre Pablito viernes, 31 de julio de 2020 22:47
-
Muy bien.
Un paso es un paso. No se mueve, en caso de moverse, tiene que estar acorde con que el punto vertica es la Y como coordenada, la X como horizontal con el punto del círculo.
Se mueve de 0º a 360 º.
Recuerda, e lpunto del círculo, es el punto (X, Y) como coordenada.
Saludos.
http://electronica-pic.blogspot.com
-
Bueno
Ya arreglé lo de que la x del círculo sea la x de la linea horizontal y la y del círculo sea la y de la linea vertical.
Igual antes se movía, lo que te pasó es que no asignaste el método del evento Load, donde se activa el Timer.
Asegurate de asignar los 3 métodos a sus eventos, para que te funcione, Form1_Load, pictureBox1_Paint, y timer1_Tick.
using System; using System.Drawing; using System.Windows.Forms; namespace WindowsFormsAppCircleAndPoints { public partial class Form1 : Form { private int pt1a = 0; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { timer1.Start(); } private void pictureBox1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; int ptx, pty; g.Clear(Color.White); g.DrawEllipse(Pens.Black, new Rectangle(40, 40, 300, 300)); g.DrawLine(Pens.Black, 20, 40, 20, 340); g.DrawLine(Pens.Black, 40, 360, 340, 360); ptx = (int)(Math.Cos((double)pt1a*Math.PI / 180.0) * 150.0); pty = (int)(Math.Sin((double)pt1a*Math.PI / 180.0) * 150.0); g.FillEllipse(Brushes.Black, new Rectangle(190 + ptx - 5, 190 - pty - 5, 11, 11)); g.FillEllipse(Brushes.Black, new Rectangle(15, 190 - pty - 5, 11, 11)); g.FillEllipse(Brushes.Black, new Rectangle(190 + ptx - 5, 355, 11, 11)); } private void timer1_Tick(object sender, EventArgs e) { pt1a += 2; if (pt1a >= 360) pt1a -= 360; pictureBox1.Invalidate(); } } }
- Marcado como respuesta Metaconta sábado, 1 de agosto de 2020 1:56
-
-
Buen día
Si, se puede.
Podes asignar al Text del label al final del método del evento Paint.
Si queres poner las coordenadas del punto, es:
x = 190 + ptx
y = 190 - pty
El ángulo es pt1a
- Marcado como respuesta Metaconta sábado, 1 de agosto de 2020 14:01
-
using System; using System.Drawing; using System.Windows.Forms; namespace Movimiento_armonico_simple_01_cs { public partial class Form1 : Form { private int pt1a = 0; private void timer1_Tick(object sender, EventArgs e) { pt1a += 2; if (pt1a >= 360) pt1a -= 360; pictureBox1.Invalidate(); } private void Form1_Load(object sender, EventArgs e) { timer1.Start(); } private void pictureBox1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; int ptx, pty; g.Clear(Color.White); g.DrawEllipse(Pens.Black, new Rectangle(40, 40, 300, 300)); g.DrawLine(Pens.Black, 20, 40, 20, 340); g.DrawLine(Pens.Black, 40, 360, 340, 360); ptx = (int)(Math.Cos((double)pt1a * Math.PI / 180.0) * 150.0); pty = (int)(Math.Sin((double)pt1a * Math.PI / 180.0) * 150.0); // Punto del círculo. g.FillEllipse(Brushes.Black, new Rectangle(190 + ptx - 5, 190 - pty - 5, 11, 11)); // Punto de la recta Y. g.FillEllipse(Brushes.Black, new Rectangle(15, 190 - pty - 5, 11, 11)); // Punto de la recta X. g.FillEllipse(Brushes.Black, new Rectangle(190 + ptx - 5, 355, 11, 11)); int x = 190 + ptx; int t = 190 - pty; label_X.Text = "X:" + ptx.ToString(); // Muestra valores X. label_Y.Text = "Y:" + pty.ToString(); // Muestra valores Y. label_circulo_360.Text = "(X, Y) = 360º: " + pt1a.ToString(); // Muestra de 0º a 360 º. } public Form1() { InitializeComponent(); } } }
http://electronica-pic.blogspot.com
-
-
-
Lo hice así que se sume de a 2 y con 50 FPS (o sea, Interval a 20) y la velocidad quedó bien. Se va sumando el ángulo hasta que llega a 360 y luego empieza de 0 otra vez. Si hubiera sumado de a 1 se vería a la mitad de velocidad y si hubiera sumado de a 4 se vería al doble de velocidad. Salvo que cambie el Interval, cuanto menor es éste, mayor es la velocidad.
Por ejemplo, si sumo de a 1 en vez de 2 y con Interval a 10 en lugar de 20, se vería a igual velocidad pero con mayor precisión.
Saludos
- Marcado como respuesta Metaconta lunes, 3 de agosto de 2020 12:26