Programación General > Visual Basic para principiantes
Primeriza en vb6 - Como dibujar un punto y una recta?
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...
--- Fin de la cita ---
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:
--- 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...
--- Fin de la cita ---
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
--- Fin de la cita ---
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 ---radian= 6'28 /360 * giroXd = Cos(Radian) * Xo + Sin(Radian) * YoYd = Cos(Radian) * Yo - Sin(Radian) * Xo
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 --- ' nuestras variables Dim Xo As Long ' x origenDim Yo As Long ' Y origenDim Xd As Long ' X destinoDim Yd As Long ' Y destionDim 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 Const naranja = &H80FF& ' es el color para dibujar nuestra 'naranja'. ' el chackbox activa y desactiva el timer, que es donde se eejcuta la rutina de calculo y dibujadoPrivate Sub Check1_Click() If Check1.Value = 0 Then Check1.Caption = "Rotar" Else Check1.Caption = "Parar" End If Timer1.Enabled = Not Timer1.EnabledEnd Sub ' al crear el formulario establecemos los valores inicialesPrivate Sub Form_Load() Timer1.Enabled = False ' paramos el timer y le damos un valor rápido al intérvalo... Timer1.Interval = 1 VScroll1.max=359 ' limitamos nuestro scroll con la misma cantidad de pasos que queremos que gire de una vez nuestra naranaja VScroll1.largechange=10 ' 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.. Picture1.Scale (-200, -200)-(400, 400) Picture1.DrawWidth = 10 ' dibujaremos un punto, lo hacemos grande para que sea perceptible a la vista 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) Yo = 80 Me.Show ' antes que nada diibujamos nuestra naranjua para que se vea donde está colocada inicialmente Call Timer1_TimerEnd Sub ' cuando no actúa el timer, podemos rotar manualmente, paso a paso nuestra naranja Private Sub VScroll1_Change() giro = VScroll1.Value Call Timer1_TimerEnd Sub ' pot fin nuestra rutina de cálculo y dibujadoPrivate Sub Timer1_Timer() Dim Radian As Double ' o single, para no despreciar decimales, aunque aquí nuestro 'mundo' (el picturebox) es entero Radian = 6.28 / 360 * giro ' calculamos el ángulo Xd = Cos(Radian) * Xo + Sin(Radian) * Yo ' calculamos la cordenada x de destino Yd = Cos(Radian) * Yo - Sin(Radian) * Xo ' calculamos la cordenada y de destino Picture1.Cls ' borramos el picturebox Picture1.Circle (40, 40), 80, vbBlue ' dibujamos un círculo, como referencia visual 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... 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...End Sub 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).
Noemii85:
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:
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...
Noemii85:
--- 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...
--- Fin de la cita ---
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. ^_^
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa