Bienvenido(a), Visitante. Por favor, ingresa o regístrate. ¿Perdiste tu email de activación?
Abril 26, 2024, 02:27:09 pm

Autor Tema: ¿Algún experto en trigonometría?  (Leído 7107 veces)

fre3men

  • Mecenas HeroQuest.es
  • Reseñer Plata HQ.es
  • Administrador
  • *
  • Mensajes: 6979
  • Me apetece jugar al Merchants & Marauders
    • HeroQuest.ES
¿Algún experto en trigonometría?
« en: Septiembre 08, 2014, 08:31:04 pm »
¿Alguien podría ayudarme o mejor dicho decirme como puedo hallar un punto en unas coordenadas (x,y) que se encontraba a una distancia x,y rotadas?

Creo que me explico fatal. Esa coordenada que quiero hallar se encuentra a una distancia del punto de rotación, tengo la X,Y del elemento y la X,Y del punto de rotación, roto dicho punto un valor en grados de 0 a 360 y debería conocer en donde acaba las coordendas de los objetos alejados al punto de rotación.

Os pongo un par de imágenes para visualizar lo que comento:




¿Qué fórmula debería aplicar para modificar las coordenadas x,y de los objetos A y B según el grado de rotación? Este modificador sería para poder aplicarlo a cualquier objeto que se añade, así siempre se sabrá la ubicación exacta de ellos.

Un saludo
0


La inmovilidad a veces se confunde con la paz | Mi colección de juegos

Highorph

  • Mecenas HeroQuest.es
  • Guerrero del Caos
  • *
  • Mensajes: 1142
Re:¿Algún experto en trigonometría?
« Respuesta #1 en: Septiembre 08, 2014, 08:40:22 pm »
Pasar de cartesianos a polares?
5

Cannonball

  • Orco
  • *
  • Mensajes: 162
Re:¿Algún experto en trigonometría?
« Respuesta #2 en: Septiembre 08, 2014, 08:45:10 pm »
Deberías plantear el problema en coordenas polares, te vas a ahorrar bastante trabajo:

    x = r *cos (theta)

    y = r *sen (theta)

    x^2 + y^2 = r^2

    theta = arctan (y/x)

https://es.wikipedia.org/wiki/Coordenadas_polares

Echale un vistazo y si tienes alguna duda pregunta, que te puedo echar una mano
5

fre3men

  • Mecenas HeroQuest.es
  • Reseñer Plata HQ.es
  • Administrador
  • *
  • Mensajes: 6979
  • Me apetece jugar al Merchants & Marauders
    • HeroQuest.ES
Re:¿Algún experto en trigonometría?
« Respuesta #3 en: Septiembre 08, 2014, 08:52:28 pm »
¿Para qué un cartaginiense quiere un polo?


Algo es algo! investigaré a ver.

El hecho de preguntar esto es que uso esas coordenadas para añadirle formas a un gráfico (teniendo en cuenta que el centro del gráfico es la coordenada 0,0) y luego comparar estas formas con las que tiene otro objeto y hallar así colisiones. Si roto alguno de los dos objetos a comparar (por si colisionan) se va al carajo! funcina perfectamente si no hay rotación, pero no quiero añadir un sprite por cada rotación e indicar sus puntos de colisión.

Citar
Deberías plantear el problema en coordenas polares, te vas a ahorrar bastante trabajo:

Iba a contestar y he visto tu mensaje. Si, miraré eso (ok), aunque debo trabajar en coordenadas cartesianas a causa de la aplicación.


Gracias a ambos :) (aunque volveré a preguntar ;D)
0


La inmovilidad a veces se confunde con la paz | Mi colección de juegos

Karl

  • Orco
  • *
  • Mensajes: 119
Re:¿Algún experto en trigonometría?
« Respuesta #4 en: Septiembre 08, 2014, 09:00:32 pm »
Si lo que buscas son las coordenadas que resultan de rotar sobre un centro de giro C(x0,y0) un punto P(x,y) un ángulo alfa, las transformaciones que debes hacer son las siguientes:

1.- Traslación del centro C al origen de coordenadas y por lo tanto del punto P también obteniendo el punto P'(x-x0,y-y0)
2.- Rotación del punto obtenido P' respecto del origen un ángulo alfa. Se obtiene un punto P'' de coordenadas
     P''((x-x0)*cos(alfa) - (y-y0)*sin(alfa) , (x-x0)*sin(alfa) + (y-y0)*cos(alfa))
3.- Por último volvemos a desplazar el centro desde el origen a su lugar inicial con lo que el punto P'' también se desplaza
     Resultado final:
                              P'''(x0 + (x-x0)*cos(alfa) - (y-y0)*sin(alfa) , y0 + (x-x0)*sin(alfa) + (y-y0)*cos(alfa))

Espero haberte ayudado

Un saludo
5

hobbynauta

  • Goblin
  • *
  • Mensajes: 14
Re:¿Algún experto en trigonometría?
« Respuesta #5 en: Septiembre 09, 2014, 10:03:22 am »
¡¡A ver si podemos echar una mano!! (aunque es más de lo mismo)



Saludos
5
« Última modificación: Septiembre 09, 2014, 10:05:38 am por hobbynauta »

fre3men

  • Mecenas HeroQuest.es
  • Reseñer Plata HQ.es
  • Administrador
  • *
  • Mensajes: 6979
  • Me apetece jugar al Merchants & Marauders
    • HeroQuest.ES
Re:¿Algún experto en trigonometría?
« Respuesta #6 en: Septiembre 09, 2014, 08:02:17 pm »
Os agradezco la ayuda, pero no hay manera, maldito Pitágoras.

       d = sqrt((x - h)^2 +  (y - k)^2);
        x = h  +  r * cos t;
        y = k  +  r * sin t;
        t = arc cos ((x - h) / r)
        t = arc sin ((y - k) / r)
        a = t * 180/PI -> grados
        t = a * PI/180 -> radianes


Donde h,k son las coordenadas x,y del punto de rotación. d es la distancia entre ambos puntos (o vectores) que en este caso equivale al radio (r). t es el theta el ángulo en radianes (que es como rota el Processing) y a es el ángulo en grados.

He creado esta aplicación para ver los resultados, pero (a parte del enorme problema de tener que entender que las ordenadas están invertidas, pero las abscisas no a causa de como se representa en la pantalla, pues hago traslación del punto 0,0 que es la esquina superior izquierda al centro width/2 height/2) no corresponden todas las coordenadas resultantes ni tampoco el signo.






CLICK con el ratón para ubicar el objeto A en cualquier cuadrante. CURSORES mueven el objeto con mayor precisión. Teclas E y R rotan el objeto teniendo como referencia el eje 0,0.


// ==============================================
// Title: Pruebas coordenadas y rotación
// Autor: fre3men
// Copyright: CC 3.0 By-Nc-Sa
// ==============================================

// NOTA: Hay que tener en cuenta que las coordenadas Y (ordenadas) están invertidas
// a causa de que a la hora de dibujar, tenemos en cuenta que siempre es el centro 0,0
// así que para desplazar hacia arriba en el eje Y este es negativo en pantalla

// https://es.wikipedia.org/wiki/Circunferencia
// https://processing.org/tutorials/trig/


// GLOBALS
int posX = 0, posY = 0; // Para posicionar el objeto A
int posX_c = 0, posY_c = 0; // Punto de rotación
float distance = 0; // Distancia entre el punto de rotación y el objeto
float angle = 0;
float theta = 0; //2*PI;
int rotation = 0;


// SETUP
void setup() {

   size(500, 500);
   frameRate(30);

   smooth(); // Aplicamos el filtro anti-aliasing

   rectMode(CENTER);
   ellipseMode(CENTER);

}


void draw() {
   
        background(0); // CLEAR SCREEN
        noFill(); // sin relleno
        stroke(255); // white
           
       
        //d = sqrt((x - h)^2 + (y - k)^2);
        //x = h + r * cos t;
        //y = k + r * sin t;
        //t = arc cos ((x - h) / r)
        //t = arc sin ((y - k) / r)
        //a = t * 180/PI -> degrees
        //t = a * PI/180 -> radians
             
        distance = sqrt((posX - posX_c) * (posX - posX_c) + (posY - posY_c) * (posY - posY_c));
        if (distance != 0) { // Evitar error de división por cero

                theta = asin(posY / distance); // La distancia es como la hipotenusa o radio si tenemos en cuenta que el vector respecto la rotación forma parte de una circunferencia
                //theta = acos(posX / distance);
                angle = degrees(theta); // Pasamos a grados
                //theta = radians(angle);
                       
        }
        else {
                theta = angle = 0;
        }
       
        pushMatrix();      
        translate(width/2, height/2); // Desplazamos el punto de dibujo al medio de la pantalla
        rotate(radians(rotation));
       
       
        // Dibujamos los ejes cartesianos
        stroke(255);
        line(0, -200, 0, 200);
        line(-200, 0, 200, 0);        
       
        ellipse(posX_c, posY_c, 150, 150);
       
        ellipse(posX, posY, 50, 50); // Objeto A
       
        stroke(75);
        line(0, 0, posX, posY); // Línea que nos remarca la distancia entre el punto A y el punto B
     
        fill(255);
        textSize(20);
        text("Eje X", -180, -10);
        text("Eje Y", +10, -180);
     
        popMatrix();
       
       
        textSize(15);
        text("PosX: " + posX, width/2 + 50, height/2 + 100);
        text("PosY: " + posY, width/2 + 50, height/2 + 120);
        text("Distancia: " + distance, width/2 + 50, height/2 + 140);
        text("Ángulo: " + angle + "º", width/2 + 50, height/2 + 160);
        text("Rotación: " + rotation + "º", width/2 + 50, height/2 + 180);
       
        if (rotation != 0) {
               
                float x = posX_c + distance * cos(theta + radians(rotation));
                float y = posY_c + distance * sin(theta + radians(rotation));
               
                text("Ángulo+Rot: " + (angle + (float)rotation) + "º", width/2 -210, height/2 + 140);
                text("PosX real: " + x, width/2 - 210, height/2 + 160);
                text("PosY real: " + y, width/2 - 210, height/2 + 180);
        }
 
}

void mousePressed() {
        posX = mouseX - width/2;
        posY = mouseY - width/2;
}

void keyPressed() {
 
        switch(keyCode) {
               
                case RIGHT:
                        posX++;
                        break;
                case LEFT:
                        posX--;
                        break;
                case UP:
                        posY--;
                        break;
                case DOWN:
                        posY++;
                        break;
                case 82: // R
                        rotation++;
                        break;
                case 69: // E
                        rotation--;
                        break;                        
        }
}
0
« Última modificación: Septiembre 09, 2014, 09:52:46 pm por fre3men, Razón: Arreglado el tema, código... »


La inmovilidad a veces se confunde con la paz | Mi colección de juegos

Karl

  • Orco
  • *
  • Mensajes: 119
Re:¿Algún experto en trigonometría?
« Respuesta #7 en: Septiembre 09, 2014, 09:15:12 pm »
Fre3men, te hago una corrección en el despeje de t en tus ecuaciones.

        d = sqrt((x - h)^2 + (y - k)^2);
        x = h + d * cos t;
        y = k + d * sin t;
        t = arc cos ((x - h) / d)
        t = arc sin ((y - k) / d)
        a = t * 180/PI -> grados
        t = a * PI/180 -> radianes
8

fre3men

  • Mecenas HeroQuest.es
  • Reseñer Plata HQ.es
  • Administrador
  • *
  • Mensajes: 6979
  • Me apetece jugar al Merchants & Marauders
    • HeroQuest.ES
Re:¿Algún experto en trigonometría?
« Respuesta #8 en: Septiembre 09, 2014, 09:36:23 pm »
GENIAL!!!! además de daltónico soy disléxico! apañado voy

Gracias, pues con tanta prueba y no ver que había confundido el sino con el cosino, había dejado algún valor negativo para hacer pruebas.

Ahora funciona la aplicación, a falta de probar realmente los modificadores con colisiones. Si se hace un cícurlo con ángulo 45 y se rota de 90 en 90 (con la E o R), se ve fácilmente que coincidien las coordenadas "reales" del objeto rotado (manteniendo las coordenadas originales). :)

 (yahoo)


He actualizado el tema anterior y actualizado también la aplicación, así por CANVAS, directamente desde el navegador hay una apliación para calcular posiciones, distancia y ángulos (teniendo en cuenta que es para aplicaciones, con el eje Y invertido).


Un saludo y gracias de nuevo! (amigos)



Ay, he cantado victoria antes de tiempo  :-X Genera un error sobre el eje Y cuando rotas objetos que sólo están en el plano X o a la inversa, error en el eje X si el objeto está sólo en el eje de las ordenadas  :-/
0
« Última modificación: Septiembre 09, 2014, 10:04:59 pm por fre3men »


La inmovilidad a veces se confunde con la paz | Mi colección de juegos

Karl

  • Orco
  • *
  • Mensajes: 119
Re:¿Algún experto en trigonometría?
« Respuesta #9 en: Septiembre 09, 2014, 11:11:45 pm »
Para evitar esa dificultad es mejor que realices los cambios que te propuse:

Si quieres rotar alrededor del origen un punto P (x, y) un ángulo alfa, entonces el punto obtenido P' tiene por coordenadas

x' = x*cos(alfa) - y*sin(alfa)

y' = x*sin(alfa) + y*cos(alfa)

Prueba a ver si así no te da errores
0

Darth Ezekiel

  • Mecenas HeroQuest.es
  • Reseñer HQ.es
  • Guerrero del Caos
  • *
  • Mensajes: 1268
  • Creador, jugador y narrador de MDSD
    • Facebook Miles Dei Servus Diaboli
Re:¿Algún experto en trigonometría?
« Respuesta #10 en: Septiembre 10, 2014, 10:14:30 am »
Fre3men yo no tengo ni idea de mates... Pero me tienes realmente intrigado
0
Con mi espada no puedo abrazarte y sin ella no puedo defenderte.

fre3men

  • Mecenas HeroQuest.es
  • Reseñer Plata HQ.es
  • Administrador
  • *
  • Mensajes: 6979
  • Me apetece jugar al Merchants & Marauders
    • HeroQuest.ES
Re:¿Algún experto en trigonometría?
« Respuesta #11 en: Septiembre 10, 2014, 11:54:19 am »
Karl, con las últimas funciones no calcula bien. No obstante, aunque hay error, este es insignificante para la aplicación (para otras cosas podría ser garrafal), ya que para ubicar las formas en un plano cartesiano lo haré con valores enteros (que representan los píxeles de la pantalla). Por ello x = 0,0003 será 0 y así con cualquier valor. Lo único que he hecho finalmente es formatear a integer la variable float (con decimales) y ya está, la aplicación no tendrá errores (ahora bien, si lo usamos para movernos millones de años luz en el espacio, con ese error seguro que acabamos dentro de una estrella o succionados por un agujero negro ;D).


Finalmente (aunque el error que genera es similar) lo he dejado así:

                if (posX == 0 && posY >= 0) {
                        theta = PI/2;
                }
                else if (posX == 0 && posY < 0) {
                        theta = 3*PI/2;
                }
                else if (posX > 0 && posY >= 0) {
                        theta = atan(posY / posX);
                }
                else if (posX > 0 && posY <0) {
                        theta = atan(posY / posX) + 2*PI; 
                }
                else if (posX < 0) {
                        theta = atan(posY / posX) + PI;
                }
               
                angle = degrees(theta); // Pasamos a grados



Y para hallar la nueva posición (sabiendo que el centro de rotación será siempre 0,0 pues ya luego hago traslación del mismo) es:

                distance = sqrt(posX * posX + posY * posY);
                x = distance * cos(theta + radians(rotation));
                y = distance * sin(theta + radians(rotation));


Todas ellas variables declaradas como float, luego la x,y resultantes formateadas a integer (int).


Fre3men yo no tengo ni idea de mates... Pero me tienes realmente intrigado
Forma parte de mis propias librerías que estoy haciendo para juegos 2D con Processing ;) A parte de las colisiones, pues sistema de capas!!!, objetos animados...
3


La inmovilidad a veces se confunde con la paz | Mi colección de juegos