elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Mover un objeto en el plano
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Mover un objeto en el plano  (Leído 2,758 veces)
nolasco281


Desconectado Desconectado

Mensajes: 319


Ver Perfil
Mover un objeto en el plano
« en: 26 Julio 2015, 07:05 am »

Hola como estan.

Tengo la siquente duda quisiera mover un objeto en el plano como el titulo lo indica es decir mover un pictureBox por cierto recorrido ya definido.

Aca un ejemplo.


Se me han ocurrido varias soluciones pero no las veo nada practicas.

como mover el picturebox por posciciones es decir ir asignadole cordenadas para dibujar la curva y moverlo con un timer.

Estoy leyendo la libreria Graphics talvez encuentro algo por ahi.

Mi duda mas concreta es como dibujo una curva (o un recorrido) y que el piturebox se mueva sobre ese recorrido, no se si me doy a entender.

No se que librerias puedo usar para hacer este tipo de practica les agradeceria cualquier ayuda

Saludos.

PD: Estoy trabajando en vb.net


« Última modificación: 26 Julio 2015, 07:35 am por nolasco281 » En línea

Lo que se puede imaginar... se puede programar.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.809



Ver Perfil
Re: Mover un objeto en el plano
« Respuesta #1 en: 26 Julio 2015, 22:56 pm »

Se me han ocurrido varias soluciones pero no las veo nada practicas.

como mover el picturebox por posciciones es decir ir asignadole cordenadas para dibujar la curva y moverlo con un timer.

¿De que otra forma piensas que se podría mover un control si no utilizas "algo" (como un Timer, o el método Threading.Sleep) para asignarle unas coordenadas distintas a las actuales y así moverlo?.

No soy experto en gráficos, pero vaya creo que no puede haber otra forma en esencia es eso...



Mi duda mas concreta es como dibujo una curva (o un recorrido) y que el piturebox se mueva sobre ese recorrido, no se si me doy a entender.

Simplemente utiliza el evento Paint para dibujar:

Código
  1.    ' Create points that define curve.
  2.    Dim point1 As New Point(50, 50)
  3.    Dim point2 As New Point(100, 25)
  4.    Dim point3 As New Point(200, 5)
  5.    Dim point4 As New Point(250, 50)
  6.    Dim point5 As New Point(300, 100)
  7.    Dim point6 As New Point(350, 200)
  8.    Dim point7 As New Point(250, 250)
  9.  
  10.    Dim curvePoints As Point() =
  11.        {
  12.            point1, point2,
  13.            point3, point4,
  14.            point5, point6,
  15.            point7
  16.        }
  17.  
  18.    ''' <summary>
  19.    ''' Handles the <see cref="E:Paint" /> event.
  20.    ''' </summary>
  21.    ''' <param name="e">A <see cref="T:System.Windows.Forms.PaintEventArgs" /> that contains the event data.</param>
  22.    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
  23.  
  24.        MyBase.OnPaint(e)
  25.  
  26.        Using graphPath As New GraphicsPath
  27.  
  28.            graphPath.AddCurve(curvePoints)
  29.  
  30.            Using pathPen As New Pen(Color.Red)
  31.                e.Graphics.DrawPath(pathPen, graphPath)
  32.            End Using
  33.  
  34.        End Using
  35.  
  36.    End Sub

Para mover un elemento por el trazo, necesitas averiguar algunos factores, yo no soy muy bueno en la aritmética así que he sacado (y refactorizado) un ejemplo que encontré aquí:
http://www.dreamincode.net/forums/topic/293148-getting-an-object-to-follow-a-bezier-curve/

Código
  1. MoveControl(ctrl:=Me.PictureBox1, speed:=200, path:=curvePoints)

Código
  1. ''' <summary>
  2. ''' Moves a control through a path.
  3. ''' </summary>
  4. ''' <param name="ctrl">The control to move.</param>
  5. ''' <param name="speed">The animation speed.</param>
  6. ''' <param name="path">The path to follow.</param>
  7. Public Shared Sub MoveControl(ByVal ctrl As Control,
  8.                              ByVal speed As Integer,
  9.                              ByVal path As IEnumerable(Of Point))
  10.  
  11.    For index As Integer = 1 To (path.Count - 1)
  12.  
  13.        Dim m As Double = (path(index).Y - path(index - 1).Y) / (path(index).X - path(index - 1).X)
  14.        Dim c As Double = (path(index).Y) - (m * path(index).X)
  15.        Dim sign As Integer = Math.Sign(path(index).X - path(index - 1).X)
  16.  
  17.        While (ctrl.Left <> path(index).X)
  18.  
  19.            Application.DoEvents()
  20.            ctrl.Left += (sign * 5)
  21.            ctrl.Top = CInt(m * CDbl(ctrl.Left) + c)
  22.            Thread.Sleep(speed)
  23.  
  24.        End While
  25.  
  26.    End Sub



No se que librerias puedo usar para hacer este tipo de practica les agradeceria cualquier ayuda

¿A qué tipo de prácticas te refieres exactamente?, ¿a mover un elemento por la UI, o desarrollar un juego?.

Para lo primero ...simplemente es mover el control y ya está, cualquiera puede hacerlo sin una librería que nos haga de "ayudante" xD, sin embargo, existe una librería dedicada a efectos/transiciones para la UI, la cual proporciona un método para mover un elemento de un punto a otro, la utilización sería algo así:

(el control se mueve mal, pero es solo un ejemplo on-the-fly, como ya dije los cálculos de los ángulos en fin la trayectoria se me da mal)

Código
  1. Imports Transitions
  2.  
  3. Public NotInheritable Class Form1 : Inherits Form
  4.  
  5.    ' Create points that define curve.
  6.    Dim point1 As New Point(50, 50)
  7.    Dim point2 As New Point(100, 25)
  8.    Dim point3 As New Point(200, 5)
  9.    Dim point4 As New Point(250, 50)
  10.    Dim point5 As New Point(300, 100)
  11.    Dim point6 As New Point(350, 200)
  12.    Dim point7 As New Point(250, 250)
  13.  
  14.    Dim curvePoints As Point() =
  15.        {
  16.            point1, point2,
  17.            point3, point4,
  18.            point5, point6,
  19.            point7
  20.        }
  21.  
  22.    Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) _
  23.    Handles MyBase.Shown
  24.  
  25.        Dim speed As Integer = 200
  26.        Dim transitions As New List(Of Transition)
  27.  
  28.        For index As Integer = 0 To (curvePoints.Count - 2) Step 2
  29.  
  30.            Dim transition As New Transition(New TransitionType_Linear(iTransitionTime:=speed))
  31.            With transition
  32.                .add(PictureBox1, "Left", curvePoints(index).X)
  33.                .add(PictureBox1, "Top", curvePoints(index + 1).Y)
  34.            End With
  35.  
  36.            transitions.Add(transition)
  37.  
  38.        Next
  39.  
  40.        Transition.runChain()
  41.  
  42.    End Sub
  43.  
  44. End Class

Para lo segundo, suponiendo que estés desarrollando un juego (por las imágenes de los coches, y ahora las curvas), entonces estás empezando mal, deberías utilizar librerías especializadas en esa temática, cualquier librería basada en DirectX u OpenGL, o el framework XNA de Microsoft (aunque está deprecado ya), etc.

SharpDX

Sin embargo, es una temática muy compleja de manejar, crear una forma y dibujarla lo puede hacer cualquier (aunque solo eso ya necesita unas cuantas lecturas de manual xD), yo intenté hacer algo simple hace un tiempo y me agobié por completo al final xD.

Saludos


« Última modificación: 26 Julio 2015, 23:02 pm por Eleкtro » En línea

nolasco281


Desconectado Desconectado

Mensajes: 319


Ver Perfil
Re: Mover un objeto en el plano
« Respuesta #2 en: 27 Julio 2015, 06:44 am »

Hola gracias por responder.

Si realizando algo como un juego, he leido que como tal VB.net es malo para ese fin y hay que usar  frameworks como XNA o los otros que indicas.

Con lo que he leido y men compartes creo que es suficiente para poder sequir avanzando
https://www.daniweb.com/software-development/vbnet/code/486368/vb-net-gamessim-projectile-motion

Gracias por contestar disculpas por contestar tan tarde he estado un poco ocupado, cuando resuelva la curva del carro comparto el codigo

Saludos Gracias.  ;D
En línea

Lo que se puede imaginar... se puede programar.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines