none
Mover punto en el pictureBox RRS feed

  • 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.

    Ver vídeo.

    ¿Alguna idea?

    Saludos.


    http://electronica-pic.blogspot.com

    miércoles, 29 de julio de 2020 18:03

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
    sábado, 1 de agosto de 2020 0:29
  • 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
    sábado, 1 de agosto de 2020 11:47
  • 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
    domingo, 2 de agosto de 2020 13:06

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?
    miércoles, 29 de julio de 2020 18:32
    Moderador
  • 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. 

    miércoles, 29 de julio de 2020 20:46
    Moderador
  • 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



    viernes, 31 de julio de 2020 22:26
  • 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

    viernes, 31 de julio de 2020 23:11
  • 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
    sábado, 1 de agosto de 2020 0:29
  • Perfecto.

    ¿Se puede poner en un lebel el punto del círculo que se mueve de 0º a 360º?

    Saludos.


    http://electronica-pic.blogspot.com

    sábado, 1 de agosto de 2020 11:23
  • 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
    sábado, 1 de agosto de 2020 11:47
  • 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

    sábado, 1 de agosto de 2020 14:01
  • Al usar ptx y pty sin sumarle 190 lo hiciste mejor que lo que yo te dije lo de las coordenadas, porque así se cuentan desde el centro del círculo, y van de -150 a 150. 150 es el radio.
    sábado, 1 de agosto de 2020 20:38
  • En la raya vertical X, tiene que ir justo donde va el punto del círculo, por eso da clavado.

    En esta parte.

                pt1a += 2;
                if (pt1a >= 360)
                    pt1a -= 360;

    ¿Por qué se le añade más 2?

    ¿Crear movimiento?

    Saludos.


    http://electronica-pic.blogspot.com

    domingo, 2 de agosto de 2020 12:07
  • 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
    domingo, 2 de agosto de 2020 13:06