0

introducir la descripción de la imagen aquí

En la imagen de arriba muestra todos los cuadrantes de la pantalla:

Este algoritmo sirve para el movimiento natural de la pelota, usado en juegos como el ping pong.

Hice este código para un cuadrante de la pantalla, es decir hice para el primer y segundo octante, pero no logro hacer los siguientes 3 cuadrantes. ¿Cómo variar la dirección? ¿Cómo mover la pelota para los diferentes 8 octantes?

Las variables dx y dy son valores para el eje X e Y respectivamente, donde es la dirección para el movimiento de la pelota, y por último, las variables xi y yi sirven para la posición actual de la pelota.

Nota: En realidad no puede ser solamente una pelota, puede ser cualquier objeto:

if (dx >= 0 && dy >= 0) {
    if (m < 1) {
        stepX = 1;
        stepY = 1;
        d = 2 * dy - dx;
        de = 2 * dy;
        dne = 2 * (dy - dx);
        respuesta = 1;
    } else {
        stepX = 1;
        stepY = 1;
        d = dy + (2 * (-dx));
        de = 2 * (-dx);
        dne = 2 * (dy - dx);
        de = -de;
        dne = -dne;
        respuesta = 2;
    }
}

¿Cómo hacer que funcione para los 8 octantes?

hubman
  • 2,624
  • 9
  • 35
  • 75
  • Las preguntas son para corregir errores, o solucionar problemas, no para debatir... De todos modos veo interesante la pregunta. –  Nov 11 '16 at 23:15
  • 1
    ¿ que pregunta ? – Trauma Nov 11 '16 at 23:15
  • 2
    @m3w, aportes como estos son bienvenidos, pero debieras mantener el formato de pregunta/respuesta, al final StackOverflow es un sitio de preguntas y respuestas. Te sugiero que edites la publicación para cambiarla por una pregunta cuya respuesta es lo que has publicado ahora, y entonces que muevas el contenido a la respuesta. Para más información mira: https://es.stackoverflow.com/help/self-answer – jachguate Nov 11 '16 at 23:27
  • 1
    quise compartir algo interesante, y que las preguntas sean las dudas, bueno tenia otra perspectiva, lo modificare luego, les suplico esperar – hubman Nov 11 '16 at 23:27
  • Esto no es una pregunta ,es un debate , una proposicion y es spam , si nos ponemos quisquillosos , porque pones un link referenciando hacia algo que has hecho y esto no es un foro donde debatir , sino está claro para que sirve stackoverflow , preguntas y respuestas , si tienes un problema con tu código es especificar el problema , como intentaste solucionarlo y la gente te puede ayudar , pero esto no tiene cabida. – CodeNoob Nov 11 '16 at 23:44
  • @CodeNoob No lo calificaría como spam, lee mi comentario anterior, considero que el aporte es más que bienvenido aquí, solo debe respetar el formato de Pregunta/Respuesta. Te invito a leer: https://es.stackoverflow.com/help/self-answer – jachguate Nov 11 '16 at 23:48
  • @jachguate no la he reportado por spam , digo no digo que sea tal , sino que es irrelevante a los temas a tratar en stackoverflow , para eso te haces un blog o lo pones en un foro. La temática de esto es muy clara y concisa. – CodeNoob Nov 11 '16 at 23:51
  • 1
    ya lo modifique no hagais mucho problema!!! – hubman Nov 11 '16 at 23:52
  • @CodeNoob El link que proporciono dice exactamente lo contrario, no hace falta que te montes un blog para esto, StackOverflow es el lugar indicado. Podemos discutirlo en meta, de hecho, se ha hecho bastante en el meta en Inglés, y es promovido y recomendado: https://stackoverflow.blog/2011/07/its-ok-to-ask-and-answer-your-own-questions/ – jachguate Nov 11 '16 at 23:55
  • no fue mi intension sobre el link, pense que si no era algo de mi propiedad no podia referenciarlo, error mio, otra cosa, como dije en mi primer comentario solo fue cuestion de mostrar algo interesante, y que a alguien que le interese pueda preguntar y luego responder alguno que sepa, siguiendo ese sentido estaria dentro de los parametros de stackoverflow – hubman Nov 12 '16 at 00:34
  • No veo absolutamente nada mal en publicar un video de youtube mostrando cómo funciona, todo lo contrario, lo hace más gráfico. Pero, es del programa terminado, y debería estar en la respuesta, ¿no te parece? Por otro lado, me parece un buen aporte y quiero seguir viendo estás respuestas en SOes (+1 a la respuesta). Y sí creo que la pregunta podría mejorarse. Creo que no está del todo clara la descripción del problema que estabas teniendo antes de resolverlo. Como concejo: sería bueno planterla para que alguien que no leyó tu respuesta pueda entender el problema y responder lo mismo o similar. – Mariano Nov 12 '16 at 05:14
  • 2
    En Wikipedia viene el [algoritmo que pides en Java](https://es.wikipedia.org/wiki/Algoritmo_de_Bresenham). Para que funcione en todas direcciones en tan simple como ir jugando en tu manejador de input con las combinaciones `x1` e `y1` positivas, negativas o cero. – Awes0meM4n Nov 12 '16 at 09:28
  • @CodeNoob lo modifique y ahora esta bastante claro, o no? – hubman Nov 12 '16 at 13:42
  • @ArtEze por que esta en puesto en espera? – hubman Nov 12 '16 at 13:42
  • @rn3w No supe cómo reducir el título y decidí cerrarla... Tampoco quiero que se pierda información, quisiera que en el cuerpo agregues alguna explicación o enlace sobre el algoritmo de Bresenham, y quitar ese título tan largo. –  Nov 12 '16 at 13:48
  • 1
    @ArtEze ya lo explique y modifique el titulo, hasta puse una imagen – hubman Nov 12 '16 at 14:12
  • @Awes0meM4n reabran este tema, prometo no hacer este tipo de temas nunca mas, cosas interesante pondre en mi blog y no en SOes – hubman Nov 12 '16 at 14:43

2 Answers2

2

para los cuatro cuadrantes seria :

public class Bresenham {

    public int dx, dy, de, dne, d, xi, yi;
    public static int stepX, stepY;

    public Bresenham() {
        dx = 1;
        dy = -1;
    }

    public int desplazar(int dx, int dy) {

        int respuesta = -1;
        this.dx = dx;
        this.dy = dy;
        int dxx = dx;
        if (dx == 0) {
            dxx = 1;
        }

        int m = dy / dxx;
        if (dx >= 0 && dy >= 0) {
            if (m < 1) {
                stepX = 1;
                stepY = 1;
                d = 2 * dy - dx;
                de = 2 * dy;
                dne = 2 * (dy - dx);
                respuesta = 1;
            } else {
                stepX = 1;
                stepY = 1;
                d = dy + (2 * (-dx));
                de = 2 * (-dx);
                dne = 2 * (dy - dx);
                de = -de;
                dne = -dne;
                respuesta = 2;
            }

        } else {
            if (dx > 0 && dy < 0) {
                if (m > -1) {
                    stepX = 1;
                    stepY = -1;
                    d = 2 * dy + dx;
                    de = 2 * (dy);
                    dne = 2 * (dy + dx);
                    de = -de;
                    dne = -dne;
                    respuesta = 1;
                } else {
                    stepX = 1;
                    stepY = -1;
                    d = dy + 2 * (dx);
                    de = 2 * (dx);
                    dne = 2 * (dx + dy);
                    respuesta = 2;
                }
            } else {
                if (dx <= 0 && dy <= 0) {
                    if (m > -1) {
                        stepX = -1;
                        stepY = -1;
                        d = - 2 * (dy) + dx;
                        dne = 2 * (-dy + dx);
                        de = 2 * (-dy);
                        respuesta = 1;
                    } else {
                        stepX = -1;
                        stepY = -1;
                        d = (-dy) + 2 * dx;
                        dne = 2 * (-dy + dx);
                        de = 2 * dx;
                        dne = -dne;
                        de = -de;
                        respuesta = 2;
                    }
                } else {

                    if (dx < 0 && dy > 0) {
                        if (m > -1) {
                            stepX = -1;
                            stepY = 1;
                            d = (-2 * dy) - dx;
                            de = 2 * (-dy);
                            dne = 2 * (-dy - dx);
                            dne = -dne;
                            de = -de;
                            respuesta = 1;
                        } else {
                            stepX = -1;
                            stepY = 1;
                            d = (-2 * dx) - dy;
                            de = 2 * (-dy - dx);
                            dne = 2 * (-dx);

                            respuesta = 2;
                        }
                    }

                }
            }

        }
        return respuesta;
    }
ahora explicando un poco

if (dx >= 0 && dy >= 0) {
                if (m < 1) {
                    stepX = 1;
                    stepY = 1;
                    d = 2 * dy - dx;
                    de = 2 * dy;
                    dne = 2 * (dy - dx);
                    respuesta = 1;
                } else {
                    stepX = 1;
                    stepY = 1;
                    d = dy + (2 * (-dx));
                    de = 2 * (-dx);
                    dne = 2 * (dy - dx);
                    de = -de;
                    dne = -dne;
                    respuesta = 2;
                }

            } 

la parte del if es para la posicion menor a 90 y el else es mayor a 90

hubman
  • 2,624
  • 9
  • 35
  • 75
0

Como he contestado en otra pregunta similar, depende para lo que estés haciendo puedes probar la librería Box2D. Te puede ahorrar mucho trabajo. Es un motor de física que te permite, entre otras cosas, detectar colisiones, implementar gravedad.... te recomiendo que le eches un vistazo: http://box2d.org

Fernando Forcén
  • 1,485
  • 6
  • 13
  • me gusta entender las cosas mas alla, son muy interesantes como en realidad estan implementados – hubman Nov 12 '16 at 14:14
  • En la pregunta http://es.stackoverflow.com/questions/24714/coordenadas-de-la-aguja-del-minutero tienes la formula que se usa para eso. Solo tienes que cambiar COORDENADAS ABSOLUTAS por SUMAS, y trabaja con cualquier dirección, indicada en grados o radianes. – Trauma Nov 12 '16 at 17:00