• Viernes 29 de Marzo de 2024, 11:53

Autor Tema:  Primeriza en vb6 - Como dibujar un punto y una recta?  (Leído 5855 veces)

Noemii85

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Primeriza en vb6 - Como dibujar un punto y una recta?
« en: Domingo 25 de Octubre de 2009, 10:57 »
0
Hola, soy primeriza en visual basic y me gustaría que me ayudarais un poco en esto. Tengo que hacer una práctica en la que crear un entorno y interactuar con él con elementos gráficos 2D haciendo translaciones, rotaciones, etc...

El problema esta en que no se ni como empezar, he estado mirando tutoriales y buscando ejemplos pero no he visto nada. Alguien me podría ayudar, busco ejemplos como dibujar un punto o una línea recta dando las coordenadas, o dibujando la directamente con el ratón.

Mersi por la ayuda ^_^

Noemii85

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Primeriza en vb6 - Como dibujar un punto y una recta?
« Respuesta #1 en: Sábado 7 de Noviembre de 2009, 12:02 »
0
He estado probando estos días y ya he conseguido lo que había pedido aunque nadie contestara :oops:  xD, ahora quiero ponerme a mirar lo de las rotaciones y translaciones. Pero antes, quiero mirar de poner un eje de coordenadas en el PictureBox, sabeis que método tengo que utilizar y como, para hacer algo tan sencillo como esto? jeje

Saludos y gracias. :D

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Primeriza en vb6 - Como dibujar un punto y una recta?
« Respuesta #2 en: Sábado 7 de Noviembre de 2009, 14:42 »
0
Bien, si ya sabes poner puntos y líneas (por ti solita/o) ya se te puede ayudar...

Para utilizar un sistema de cordenadas debes usar la propiedad scale

Por ejmplo:
Código: Visual Basic
  1.  
  2. picture1.scale(-100,-100)-(200,200)
  3.  
  4.  
Aquí le hemos dicho que el sistema de cordenadas tiene 200 unidades de ancho por 200 unidades de alto, y que las unidades van desde -100 en el eje de cordenadas x a: (-100 + 200), para el eje y le indicamos lo mismo que para el eje x.

Qué unidades son ?... las unidades son del sistema indicado en picture1.scalemode, por tanto si previo al código anterior le añades (delante o detrás de la línea indicada):
Código: Visual Basic
  1.  
  2. picture1.scalemode = vbpixels
  3.  
  4.  
...ahora ya sabes que las unidades son en píxeles...
Ahora practica poniendo líneas y puntos...
quiero verte poner código y alguna imagen, en tu siguiente intervención (para ver como vas y prosperas) sólo entonces te ayudaré a realizar rotaciones y demás...

saludos y al tajo.
«Ma non troppo»
----> ModoVacaciones = False<----

Noemii85

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Primeriza en vb6 - Como dibujar un punto y una recta?
« Respuesta #3 en: Viernes 27 de Noviembre de 2009, 10:27 »
0
Perdona por tardar tanto, pero he tenido mucho trabajo y apenas tengo tiempo. Quiero mirarme ahora de hacer la rotación, alguna idea?

Este es el codigo que tengo ahora mismo:
Citar

'Establim les opcions
Private Sub cmd_Dibuixar_Click(Index As Integer)
Select Case Index
       Case 0: Opcio = "Recta"
       Case 1: Opcio = "Rectangle"
       Case 2: Opcio = "Cercle"
       Case 3: Opcio = "Pintar"
End Select
End Sub
 
Private Sub Esborrar_Click()
    ' Li indiquem una ruta buida per aixi elimnar la imatge del picturebox
    With Picture1
        .Picture = LoadPicture("")
    End With
End Sub

Private Sub Form_Load()
cmd_Dibuixar(0).Caption = " Recta "
cmd_Dibuixar(1).Caption = " Rectangle "
cmd_Dibuixar(2).Caption = " Cercle "
cmd_Dibuixar(3).Caption = " Pintar "

Picture1.DrawMode = vbInvert
Picture1.DrawWidth = 1
Picture1.BackColor = vbWhite

End Sub

 
Private Sub Picture1_MouseDown(Button As Integer, _
            Shift As Integer, X As Single, Y As Single)
 
'Guardem els valors de x e y en les variables
m_x1 = X
m_y1 = Y
m_x2 = X
m_y2 = Y
 
' Guardem el radi
Radi = m_x2 - m_x1
'Flag per que no s'executi sempre el MouseMove
Flag = True
 
' para pintar
Picture1.PSet (X, Y)
End Sub
 
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, _
                                            X As Single, Y As Single)
If Not Flag Then Exit Sub
       
    Select Case Opcio      
    Case "Pintar"
       Picture1.Line -(X, Y), RGB(Rnd * 255, Rnd * 255, Rnd * 255)
    Case "Recta"
       Picture1.Line (m_x1, m_y1)-(m_x2, m_y2)
    Case "Rectangle"
       Picture1.Line (m_x1, m_y1)-(m_x2, m_y2), , B
    Case "Cercle"
       Picture1.Circle (m_x1, m_y1), Radi
    End Select      
        m_x2 = X
        m_y2 = Y
 
    Select Case Opcio          
    Case "Recta"
       Picture1.Line (m_x1, m_y1)-(m_x2, m_y2)
    Case "Rectangle"
       Picture1.Line (m_x1, m_y1)-(m_x2, m_y2), , B
    Case Else
       If m_x2 >= m_x1 Then
          Radi = m_x2 - m_x1
       Else
          Radi = m_x1 - m_x2
       End If
    End Select  
    If Opcio = "Cercle" Then Picture1.Circle (m_x1, m_y1), Radi      
End Sub
 
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, _
                                        X As Single, Y As Single)
Flag = False
End Sub

Mersi y sorry que algunas cosas estan en catalan jeje

PD: Por cierto, solita ^_^

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Primeriza en vb6 - Como dibujar un punto y una recta?
« Respuesta #4 en: Viernes 27 de Noviembre de 2009, 22:20 »
0
Mañana te atiendo al tema que hoy se me ha hecho tarde... este mensaje es para que no pienses que lo dejo pasar...
Si te parece bien haremos una especie de motor 3d sencillo...
«Ma non troppo»
----> ModoVacaciones = False<----

Noemii85

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Primeriza en vb6 - Como dibujar un punto y una recta?
« Respuesta #5 en: Sábado 28 de Noviembre de 2009, 22:27 »
0
Cita de: "Nebire"
Mañana te atiendo al tema que hoy se me ha hecho tarde... este mensaje es para que no pienses que lo dejo pasar...
Si te parece bien haremos una especie de motor 3d sencillo...

No tranquilo, si cada uno tiene sus cosas, para nada me corre prisa jeje ;)  Solo una cosa, no se a que te refieres exactamente a motor 3D, pero lo que tengo que hacer tiene k ser solo en plano 2D, para nada me tengo que complicar la vida, aunque quizas me equivoco y te refieres a otra cosa... :P

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Primeriza en vb6 - Como dibujar un punto y una recta?
« Respuesta #6 en: Domingo 29 de Noviembre de 2009, 02:07 »
0
Cita de: "Noemii85"
Cita de: "Nebire"
Mañana te atiendo al tema que hoy se me ha hecho tarde... este mensaje es para que no pienses que lo dejo pasar...
Si te parece bien haremos una especie de motor 3d sencillo...

No tranquilo, si cada uno tiene sus cosas, para nada me corre prisa jeje ;)  Solo una cosa, no se a que te refieres exactamente a motor 3D, pero lo que tengo que hacer tiene k ser solo en plano 2D, para nada me tengo que complicar la vida, aunque quizas me equivoco y te refieres a otra cosa... :P
Bien, si sólo necesitas rotación 2D, pués lo haremos más simple...

Al considerar rotación, es necesario pensar en 3D aunque luego sólo apliquemos en 2D. Yo te dy el mínimo de teoría necesaria para que en un futuro no equivoques las cosas que es lo que le ocurre a la mayoría.

Imáginate de pie en medio del salón de tu casa y enfrente de ti una ventana. Bien toma una naranja en tu mano con la otra mano clava un tenedor sobre la naranja, deja el tenedor mirando hacia la ventana. Estiende la mano que tiene la naranja, con la mano libre toca el tenedor y gíralo hasta que quede mirando hacia ti. Bien esto se llama rotación sobre su propio eje.

Ahora veamos otra rotación... sigue con tu mano extendida, el tenedor estaba al principio mirando a la ventana ahora mira a ti, bueno, pués ahora gira tú, media vuelta.... verás que el tenedor ahora vuelve a mirar hacia la ventana sin embargo tu no has tocado la naranja... esta rotación se llama rotación sobre el eje del 'mundo' (en este caso el mundo eres tú).

Cuando se desea hacer una rotación es necesario tener claro cual de las 2 es a la que te refieres. La 2ª es equivalente a hacer realmente 2 movimientos, uno de desplazamiento y otro de rotación, si considremos moverla sin algo que gira arrastrando de si lo que tiene (como sucede cuando tú tehas dado media vuelta.
Entonces si tienes la naranja en tu mano extendida, y realizas rotación (te das medida vuelta), lo que ocurre es la 2º rotación la que se refiere al propio mundo. Para girarla sobre su propio eje hay que hacer lo que ya hemos dicho antes,,,,
Mover la naranja al centro del mundo (si las cordenadas en el mundo son x=120, y=60, tenemos que hacer x=0, y=0, ya movido al centro del mundo, ahí rotamos, y luego la volvemos a desplazar donde estaba, así es como giramos sobre su propio eje algo que no está en el centro del 'mundo'.

Como ves si me has seguido hasta aquí, el resultado es un poco contradictorio con respecto a lo que hemos hecho sobre la mano, sobre la mano no hemos llevado nada al centro, porque la hemos arrastrado en nuestro movimiento... en los programas nada se hace sólo tenemos que mover uno a uno cada punto.

Bien, esa es la primera parte de la teoría de la rotación, la 2º parte versa sobre como calcular las cordenadas correspondientes.
Básicamente lo que se hace es calcular cada punto, que compone un objeto, es decir reducimos su complejidad sean objetos, figuras o líneas a meramente puntos, luego reubicando los puntos se redibuja todo de nuevo, ...líneas, figuras, objetos...
El cáclulo es el siguiente, sea 'Xo' é 'Yo' las cordenadas de origen (se conservan siempre por lo general) y sean 'Xd' e 'Yd' las cordenas de destino, estas se calculan con la siguiente fórmula:

Código: Visual Basic
  1. radian= 6'28 /360 * giro
  2. Xd = Cos(Radian) * Xo + Sin(Radian) * Yo
  3. Yd = Cos(Radian) * Yo - Sin(Radian) * Xo
  4.  

giro son los grados que aplicamos en este momento. 6'28 es 2 * PI (el número pitagórico). 360 son las particiones que queremos considerar, si fuera un círculo muy grande a lo mejor querríamos considerar subdivisiones de grado... es decir indica en cuantas pasos queremos dividr una vuelta completa. Giro tiene que ser consonante con este valor....

Para ilustrar todo esto ponemos un simple ejemplode código.... fíjate que la rotación que hacemos es alrededor del 'centro del mundo'.
Cra un proyecto nuevo, en el formulario añade un picturebos, un checkbox, un timer y un vscrollbar (o hscrollbar)... copia el código siguiente y pégalo en la ventana de código del formulario.

Código: Visual Basic
  1.  
  2.  
  3. ' nuestras variables
  4. Dim Xo As Long      '  x origen
  5. Dim Yo As Long      '  Y origen
  6. Dim Xd As Long      '  X destino
  7. Dim Yd As Long      '  Y destion
  8. Dim giro As Integer ' un valor entre 0 y 359, pero podría ser entre 0 y 100 o 0 y 150000... especifica las subdivisiones para completar una vuelta completa
  9.  
  10. Const naranja = &H80FF&  ' es el color para dibujar nuestra 'naranja'.
  11.  
  12. ' el chackbox activa y desactiva el timer, que es donde se eejcuta la rutina de calculo y dibujado
  13. Private Sub Check1_Click()
  14.     If Check1.Value = 0 Then
  15.         Check1.Caption = "Rotar"
  16.     Else
  17.         Check1.Caption = "Parar"
  18.     End If
  19.     Timer1.Enabled = Not Timer1.Enabled
  20. End Sub
  21.  
  22. '  al crear el formulario establecemos los valores iniciales
  23. Private Sub Form_Load()
  24.     Timer1.Enabled = False ' paramos el timer y le damos un valor rápido al intérvalo...
  25.     Timer1.Interval = 1
  26.  
  27.     VScroll1.max=359        '  limitamos nuestro scroll con la misma cantidad de pasos que queremos que gire de una vez nuestra naranaja
  28.    VScroll1.largechange=10
  29.    
  30.     '  dividimos el picturebox en 400 partes de ancho y  alto, si el picturebox no es cuadrado del todo, los giros tendrán forma de elipse.... prueba a modificar el tamaño para verificarlo..
  31.     Picture1.Scale (-200, -200)-(400, 400)
  32.     Picture1.DrawWidth = 10                       ' dibujaremos un punto, lo hacemos grande para que sea perceptible a la vista
  33.    
  34.     Xo = 80             ' nuestra naranja no está en el centro del mundo. por tanto nuestra rotación es alrededor del mundo, no sobre su propio eje. (con un punto tampoco lo notaríamos, si girara sobre su eje)
  35.     Yo = 80
  36.    
  37.    Me.Show          ' antes que nada diibujamos nuestra naranjua para que se vea donde está colocada inicialmente
  38.    Call Timer1_Timer
  39. End Sub
  40.  
  41. ' cuando no actúa el timer, podemos rotar manualmente, paso a paso nuestra naranja
  42. Private Sub VScroll1_Change()
  43.     giro = VScroll1.Value
  44.     Call Timer1_Timer
  45. End Sub
  46.  
  47. ' pot fin nuestra rutina de cálculo y dibujado
  48. Private Sub Timer1_Timer()
  49.     Dim Radian As Double ' o single, para no despreciar decimales, aunque aquí nuestro 'mundo' (el picturebox) es entero
  50.    
  51.     Radian = 6.28 / 360 * giro          ' calculamos el ángulo
  52.     Xd = Cos(Radian) * Xo + Sin(Radian) * Yo   ' calculamos la cordenada x de destino
  53.     Yd = Cos(Radian) * Yo - Sin(Radian) * Xo    ' calculamos la cordenada y de destino
  54.  
  55.     Picture1.Cls       ' borramos el picturebox
  56.     Picture1.Circle (40, 40), 80, vbBlue    ' dibujamos un círculo, como referencia visual
  57.     Picture1.PSet (Xd + 40, Yd + 40), naranja    ' dibujamos nuestra naranja, le hemos añadido a 'X' e 'Y' 40, porque es la mitad de 80 , la distancia a la que se encuentra del centro, para que sea una rotación concéntrica, sino sería describiría el círculo desplazado respecto delcentro del mundo... prueba quitando los valores...
  58.    
  59.     giro = (giro + 1) Mod 360    ' aumentamos el giro para el próximo ciclo, nota como truncamos el valor para que nunca exceda, y regrese al origen después del final...
  60. End Sub
  61.  
  62.  
  63.  
Nota que en todo momento x e y son siempre el mismo valor, los conservamos sin cambio, esdecir los cálculos son siempre absolutos respecto del origen... si se quieren usar valores relativos,  origen de  ahora es el destino del cálculo anterior, es decir 'Xo' é 'Xd' , serían ambos siempre 'x' (sustituiríamos'xo' por 'x' y 'xd' por x), y lo mismo para los 'y..'

Ahora te dejo un ejercicio, imagina ahora no quremos un punto sino una línea.... dibújala (una pista: para dibujar una línea necesitamos 2 puntos).
«Ma non troppo»
----> ModoVacaciones = False<----

Noemii85

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Primeriza en vb6 - Como dibujar un punto y una recta?
« Respuesta #7 en: Viernes 4 de Diciembre de 2009, 10:49 »
0
Ok mersi ^_^ , me ha quedado bastante claro, pero una preguntita, como puedo aplicar una rotación a una recta o circulo que acabo de dibujar en mi ejercicio sino se las coordenadas donde esta situada como es el caso de la naranja?

Saludos. :good:

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Primeriza en vb6 - Como dibujar un punto y una recta?
« Respuesta #8 en: Domingo 6 de Diciembre de 2009, 04:56 »
0
No puedes rotar una línea si no conoces sus cordenadas, del mismo modo que no puedes pegar una patada a un balón si no sabes donde está ni puedes cambiar de cadena la tele con el mando a distancia si lo has perdido.

A las bravas se podría hacer un programa de reconocimiento de patrones, pero sería costoso y no podrías estar segura de si esa la línea que te interesa y si se ha reconocido 'fielmente', como esperabas.

Lo correcto es no dibujar líneas sin control, sino supervisado, es decir puedes crear una estructura de tipo 'Lineas' donde recoges los 2 puntos que son a su vez una estructura de tipo cordenadas, luego puedes crear líneas y mediante una colección,  las vas metiendo en ella, estando ya 'controladas' podrás dibujarlas, rotarlas, eliminarlas,... lo que necesites...

Dame un tiempo, para que encuentre un momento de deshaogo y te hago un sencillo ejemplo que te sirva de orientación...
«Ma non troppo»
----> ModoVacaciones = False<----

Noemii85

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Primeriza en vb6 - Como dibujar un punto y una recta?
« Respuesta #9 en: Domingo 6 de Diciembre de 2009, 10:37 »
0
Cita de: "Nebire"
No puedes rotar una línea si no conoces sus cordenadas, del mismo modo que no puedes pegar una patada a un balón si no sabes donde está ni puedes cambiar de cadena la tele con el mando a distancia si lo has perdido.

A las bravas se podría hacer un programa de reconocimiento de patrones, pero sería costoso y no podrías estar segura de si esa la línea que te interesa y si se ha reconocido 'fielmente', como esperabas.

Lo correcto es no dibujar líneas sin control, sino supervisado, es decir puedes crear una estructura de tipo 'Lineas' donde recoges los 2 puntos que son a su vez una estructura de tipo cordenadas, luego puedes crear líneas y mediante una colección,  las vas metiendo en ella, estando ya 'controladas' podrás dibujarlas, rotarlas, eliminarlas,... lo que necesites...

Dame un tiempo, para que encuentre un momento de deshaogo y te hago un sencillo ejemplo que te sirva de orientación...

Ya decia yo, le daba mil vueltas y no se me ocurria como hacerlo :wacko: . Tranquilo, tomate tu tiempo, ya te agradezco todas las molestias que te estas tomando. ^_^

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Primeriza en vb6 - Como dibujar un punto y una recta?
« Respuesta #10 en: Martes 8 de Diciembre de 2009, 21:31 »
0
Te mando un sencillo proyecto, si algo no lo comprendes pregunta y te detallo. Nota especialmente la diferencia entre rotar a través del mundo y rotar sobre el propio eje.

En el proyecto, cada línea se ha tomado como eje de giro dela línea un punto extremo  del mismo (el inicial), puede elegirse cualquier punto intermedio de la línea o incluso un punto ajeno a la propia línea como centro de la línea...

El ejemplo se compone de 2 proyectos, el primero construye un objeto 'Rota' con capacidad para retener líneas en una colección y manipularlas, asímismo dibuja sobre un formulario, las líneas añadidas.
El 2 proyecto es la aplicación que prueba y manipula el objeto.

Lo que te recomiendo es que primero ejecutes el exe dentro de´la carpeta Aplicación (puede que necesites registrar la librería, previamente). Luego abre cualquiera delos 2 proyectos para ver el código.

Nota que posiblemente tendrás que actualizar, la referencia del objeto 'Rota.Dll' dentro del proyecto que prueba la aplicación.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
«Ma non troppo»
----> ModoVacaciones = False<----

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Primeriza en vb6 - Como dibujar un punto y una recta?
« Respuesta #11 en: Jueves 10 de Diciembre de 2009, 10:31 »
0
Cuéntame como te va... al ser novata no se si serás capaz de entender las clases de vb6...
«Ma non troppo»
----> ModoVacaciones = False<----

Noemii85

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Primeriza en vb6 - Como dibujar un punto y una recta?
« Respuesta #12 en: Jueves 10 de Diciembre de 2009, 14:46 »
0
Cita de: "Nebire"
Cuéntame como te va... al ser novata no se si serás capaz de entender las clases de vb6...

A la que me lo mire te comento, que voy de culo estos dias :argh:

Mersi ;)

Noemii85

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Primeriza en vb6 - Como dibujar un punto y una recta?
« Respuesta #13 en: Sábado 12 de Diciembre de 2009, 23:07 »
0
Cita de: "Nebire"
Cuéntame como te va... al ser novata no se si serás capaz de entender las clases de vb6...

Tengo que poner el dll en alguna carpeta en especial? es que no consigo hacerlo funcionar :huh:

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Primeriza en vb6 - Como dibujar un punto y una recta?
« Respuesta #14 en: Domingo 13 de Diciembre de 2009, 08:26 »
0
Antes que nada tienes que registrar la librería en el sistema:
...desde la línea de comando...
Código: Text
  1.  
  2. regsvr32 "ruta del archivoel archivo.dll"
  3.  
  4.  

Luego cuando arranques el proyecto de prueba, tienes que ir al menú proyecto referencias localiza el archivo dll... y ya está. Recuerda guardar el proyecto antes de nada más...

El proyecto de la dll, se abre sin más...
«Ma non troppo»
----> ModoVacaciones = False<----