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

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Rotar bien unas flechas, posible problema de Matemática.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Rotar bien unas flechas, posible problema de Matemática.  (Leído 2,147 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.217


Superhacker (es broma xD )


Ver Perfil
Rotar bien unas flechas, posible problema de Matemática.
« en: 15 Diciembre 2023, 02:42 am »

Intento que un programa genere un grafo de modo que las ramificaciones (hijos), si son más de una, vayan para los costados.

Los números 10 y 9, es decir los hijos del 11, están bien colocados y él también. Lo que pido ayuda para arreglar son las flechas, pues me ayudaron antes unos matemáticos pero sigo sin tener mucha idea de cómo se hace, y ahora no sé si es mala programación, o mala Matemática, o todo mal  :xD
Ambas flechas deben salir del 11 pero una debe apuntar al 10 y la otra al 9. Hago esto:
Código
  1. function InsertarNodo () {
  2. Imagenes = Imagenes+1;
  3. Nodos = Nodos+1;
  4. Grafo.attachMovie("mNodo", "Nodo"+Nodos, Imagenes);
  5. // Especificar la situación que representa:
  6. set ("Grafo.Nodo"+Nodos+".EnHP", EnHP);
  7. // Insertar flecha:
  8. Imagenes = Imagenes+1;
  9. Grafo.attachMovie("mFlecha", "Flecha"+Nodos, Imagenes);
  10. // Especificar el sitio donde se insertan:
  11. setProperty ("Grafo.Nodo"+Nodos, _y, PosicionY+33);
  12. setProperty ("Grafo.Flecha"+Nodos, _x, PosicionX);
  13. setProperty ("Grafo.Flecha"+Nodos, _y, PosicionY+6.5);
  14. Hijos = Hijos+1;
  15. if ( Hijos == 1 ) {
  16. setProperty ("Grafo.Nodo"+Nodos, _x, PosicionX);
  17. } else {
  18. Hijo = 0;
  19. Resta = 49.5*(Hijos-1);
  20. do {
  21. Hijo = Hijo+1;
  22. Posicion = Hijo*33-Resta;
  23. setProperty ("Grafo.Nodo"+(Nodos-Hijos+Hijo), _x, Posicion);
  24. // Rotación y tamaño de flecha.
  25. DistanciaXPadreHijo = Math.abs(Posicion);
  26. setProperty ("Grafo.Flecha"+Nodos, _height, Math.sqrt(Math.pow(DistanciaXPadreHijo, 2)+20*20));
  27. setProperty ("Grafo.Flecha"+Nodos, _rotation, 180/Math.PI*Math.atan (DistanciaXPadreHijo/20)*-1);
  28. } while ( Hijo < Hijos );
  29. }
  30. }
Lo que debe arreglarse, supongo debe de ser algo de esto:
DistanciaXPadreHijo = Math.abs(Posicion);

setProperty ("Grafo.Flecha"+Nodos, _height, Math.sqrt(Math.pow(DistanciaXPadreHijo, 2)+20*20));

setProperty ("Grafo.Flecha"+Nodos, _rotation, 180/Math.PI*Math.atan (DistanciaXPadreHijo/20)*-1);

La distancia creo que la calculo bien porque el padre está en 0 y el hijo está a la izquierda (número negativo) o derecha, entonces es ese mismo número convertido al positivo.

La altura o largo ahora que lo veo mejor se hace con la hipotenusa. 20 es el largo de la flecha.

Y la rotación no sé, no lo modifiqué.

¿Qué está mal?


« Última modificación: 15 Diciembre 2023, 02:43 am por Tachikomaia » En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.069



Ver Perfil
Re: Rotar bien unas flechas, posible problema de Matemática.
« Respuesta #1 en: 15 Diciembre 2023, 14:42 pm »

Requieres de cálculos complejos para hacerlo en bruto, pero como tienes Flash puedes crear los objetos de tal manera que los puedas aprovechar a tu favor, me refiero a los Puntos de Registro, dicho punto es el que toma Flash como referencia para hacer las transformaciones y locaciones.

Puedes crear tu Flecha de tal manera que el Punto de Registro esté justo arriba para que sirva como eje para las rotaciones



De igual manera con tus números para que sirva de punto de locación para la futura Flecha haciendo que coincidan ambos puntos



De forma predeterminada el Punto de Registro se sitúa siempre en la mitad del Clip, si lo quieres usar así también se puede pero debes tenerlo en cuenta la hacer los cálculos y el eje quede donde debe

Por ejemplo si he creado mis Clips haciendo que los Puntos de Registro queden donde quiero tal cual muestra las primeras imágenes que puse antes, al ejecutar:

Código
  1. x = getProperty(_root.numero, _x);
  2. y = getProperty(_root.numero, _y);
  3.  
  4. _root.attachMovie("flecha", "flecha1", 0);
  5. setProperty (_root.flecha1, _x, x);
  6. setProperty (_root.flecha1, _y, y);
  7. setProperty (_root.flecha1, _rotation, 45);
  8.  
  9. _root.attachMovie("flecha", "flecha2", 1);
  10. setProperty (_root.flecha2, _x, x);
  11. setProperty (_root.flecha2, _y, y);
  12. setProperty (_root.flecha2, _rotation, -45);

Obtengo:



La locación y rotación es mucho más simple porque solo debo obtener las coordenadas del Punto de Registro del número y hacerlas coincidir con las de la Flecha, luego la rotación igualmente toma como referencia el Punto de Registro y me basta con moverlo 45 grados para que mire a la izquierda y -45 para que mire a la derecha


En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.217


Superhacker (es broma xD )


Ver Perfil
Re: Rotar bien unas flechas, posible problema de Matemática.
« Respuesta #2 en: 16 Diciembre 2023, 04:40 am »

La flecha ya la tenía como indicaste, los números no me parece necesario...

Te paso el fla y el swf:
https://docs.google.com/document/d/1jLMtAvj-0wyl9DTUnHwF1MNjqryWMzqY/edit?usp=sharing&ouid=109273743447273895658&rtpof=true&sd=true

https://drive.google.com/file/d/1wiTv5tFwbS3lG3cj0r5vYOByGmpEaJcx/view?usp=sharing

Edit, creo que ya lo solucioné:
Código
  1. function InsertarNodo () {
  2. Imagenes = Imagenes+1;
  3. Nodos = Nodos+1;
  4. Grafo.attachMovie("mNodo", "Nodo"+Nodos, Imagenes);
  5. // Especificar la situación que representa:
  6. set ("Grafo.Nodo"+Nodos+".EnHP", EnHP);
  7. // Insertar flecha:
  8. Imagenes = Imagenes+1;
  9. Grafo.attachMovie("mFlecha", "Flecha"+Nodos, Imagenes);
  10. // Especificar el sitio donde se insertan:
  11. setProperty ("Grafo.Nodo"+Nodos, _y, PosicionY+33);
  12. setProperty ("Grafo.Flecha"+Nodos, _x, PosicionX);
  13. setProperty ("Grafo.Flecha"+Nodos, _y, PosicionY+6.5);
  14. Hijos = Hijos+1;
  15. if ( Hijos == 1 ) {
  16. setProperty ("Grafo.Nodo"+Nodos, _x, PosicionX);
  17. } else {
  18. Hijo = 0;
  19. Resta = 49.5*(Hijos-1);
  20. do {
  21. Hijo = Hijo+1;
  22. Posicion = Hijo*33-Resta;
  23. setProperty ("Grafo.Nodo"+(Nodos-Hijos+Hijo), _x, Posicion);
  24. // Rotación y tamaño de flecha.
  25. DistanciaXPadreHijo = Math.abs(Posicion);
  26. setProperty ("Grafo.Flecha"+(Nodos-Hijos+Hijo), _height, Math.sqrt(Math.pow(DistanciaXPadreHijo, 2)+20*20));
  27. Rotacion = 180/Math.PI*Math.atan (DistanciaXPadreHijo/20*-1);
  28. if ( Posicion<0 ) {
  29. Rotacion = Rotacion*-1;
  30. }
  31. setProperty ("Grafo.Flecha"+(Nodos-Hijos+Hijo), _rotation, Rotacion);
  32. } while ( Hijo < Hijos );
  33. }
  34. }
Cambié 2 cosas.

Primero, las referencias a las flechas estaban mal.
Yo ponía "Grafo.Flecha"+Nodos, pero Nodos no cambia en el do while, así que sólo rotaba una flecha.
Lo cambié a ("Grafo.Flecha"+(Nodos-Hijos+Hijo). Hijo sí cambia. Esa fórmula ya no recuerdo por qué es así, lo anoté en un diario, no voy a revisar, la cosa es que funciona.

También agregué un if para que si la flecha debe rotarse a la izquierda se multiplica la rotación por -1.

No marco el tema como solucionado porque lo pensé para casos en que hubiera muchos hijos pero por ahora sólo hay 2, así que no sé si funciona bien cuando hay más.

La X que ves en los archivos, si los viste, es para asegurarme de que el 11 se coloque en medio de la pantalla, porque a veces erraba en eso.
« Última modificación: 16 Diciembre 2023, 09:48 am por Tachikomaia » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

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