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


 


Tema destacado: [Aporte] Mejores practicas en Java


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, YreX-DwX)
| | |-+  Error al coger coordenadas del ratón con FreeGlut
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error al coger coordenadas del ratón con FreeGlut  (Leído 1,518 veces)
kaostias

Desconectado Desconectado

Mensajes: 19


Mi método da menos excepciones ergo es mejor


Ver Perfil
Error al coger coordenadas del ratón con FreeGlut
« en: 29 Octubre 2013, 19:30 »

Buenas, estoy haciendo un proyecto 2d en FreeGlut con C++ y tengo un problema, cuando hago click en una zona, las coordenadas que coge no son las que debería, son de unos 10 píxeles más abajo, pero la cosa es que cuando redimensiono el área visible de la escena haciendo zoom, se descuadra la selección. Estoy calculándola mediante porcentajes, pero no doy con ello, mi código es este:

Código:
void mouse(int button, int state, int x, int y) {
    if (button==GLUT_LEFT_BUTTON && state==GLUT_DOWN) {
// trasladarEscena('N',10);
//repaint();
//Si no había iniciado, se inicia
if (!started){
  pintarInicial(x,y);
  repaint();
//   glutPostRedisplay();

} else{
square_x = xLeft + (x)*(abs(xRight)+abs(xLeft))/WIDTH;
square_y = yBot + (HEIGHT-y)* abs(yTop)+abs(yBot))/HEIGHT;
selection = Punto(square_x,square_y);
selection_enabled = true;
}
}
   
}

Gracias.


En línea

- ¡Éste código sin documentar es un galimatías!
- Es tuyo, de hace 3 semanas
- ¡Es una obra maestra aunque esté sin documentar! ¿Qué decías que hace?
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Error al coger coordenadas del ratón con FreeGlut
« Respuesta #1 en: 29 Octubre 2013, 19:40 »

y no tendrás por algún casual los tipos de las variables implicadas, verdad??

Código
  1. square_x = xLeft + (x)*(abs(xRight)+abs(xLeft))/WIDTH;

mmmm

Hasta donde llego el ancho de la ventana debería calcularse como xRight-xLeft... ya que la suma puede darte de todo menos la anchura de la ventana.

Por tanto, square_x debería calcularse así:

Código
  1. square_x = xLeft + x*(abs(xRight)-abs(xLeft))/WIDTH;

Con la coordenada vertical te pasa lo mismo.

Como no aparece el algoritmo, puede que también tengas problemas al calcular xLeft y yBot.

Un saludo


En línea

kaostias

Desconectado Desconectado

Mensajes: 19


Mi método da menos excepciones ergo es mejor


Ver Perfil
Re: Error al coger coordenadas del ratón con FreeGlut
« Respuesta #2 en: 29 Octubre 2013, 20:09 »

No, eso no funciona. De momento selecciona bien si no se redimensiona ni mueve, pero selecciona unos píxeles por debajo de donde debería, pero si se cambia eso, ya empieza la locura.
En línea

- ¡Éste código sin documentar es un galimatías!
- Es tuyo, de hace 3 semanas
- ¡Es una obra maestra aunque esté sin documentar! ¿Qué decías que hace?
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Error al coger coordenadas del ratón con FreeGlut
« Respuesta #3 en: 30 Octubre 2013, 07:09 »

Vale, espera... una cosa... qué pinta ahí la constante WIDTH??

Código
  1. square_x = xLeft + (x/WIDTH)*(xRight-xLeft);

se supone que x/WIDTH te va a dar el desplazamiento en porcentaje... eso lo multiplicas por la escala real y te debería dar las coordenadas reales, cierto??

También deberías mirar el tipo de las variables... si estás operando con int vas a tener problemas con los redondeos... sobretodo si las operaciones de división se ejecutan antes que las de producto.
En línea

kaostias

Desconectado Desconectado

Mensajes: 19


Mi método da menos excepciones ergo es mejor


Ver Perfil
Re: Error al coger coordenadas del ratón con FreeGlut
« Respuesta #4 en: 30 Octubre 2013, 20:40 »

También es posible que el problema esté en la redimensión del área visible de la escena. He de decir que el área visible y el puerto de vista son proporcionales.

Código:
void resize(int newWidth, int newHeight){
int oldwidth = WIDTH;
int oldheight = HEIGHT;
  //Resize Viewport
  WIDTH= newWidth;
  HEIGHT= newHeight;
  GLdouble RatioViewPort= (float)WIDTH/(float)HEIGHT;
  glViewport ( 0, 0, WIDTH, HEIGHT ) ;
 
  //Resize Scene Visible Area
  //Se actualiza el área visible de la escena
  //para que su ratio coincida con ratioViewPort
  GLdouble SVAWidth= xRight-xLeft;
  GLdouble SVAHeight= yTop-yBot;
  GLdouble SVARatio= SVAWidth/SVAHeight;

  if (newWidth < oldwidth || newHeight < oldheight){
if ( SVARatio >= RatioViewPort) {
// Increase SVAHeight
GLdouble newHeight= SVAWidth/RatioViewPort;
GLdouble yMiddle= ( yBot+yTop )/2.0;
yTop= yMiddle + newHeight/2.0;
yBot= yMiddle - newHeight/2.0;
}
  if ( SVARatio < RatioViewPort) {
//Increase SVAWidth
GLdouble newWidth= SVAHeight*RatioViewPort;
GLdouble xMiddle= ( xLeft+xRight )/2.0;
xRight= xMiddle + newWidth/2.0;
xLeft=  xMiddle - newWidth/2.0;
  }
  }

  if (newWidth > oldwidth || newHeight > oldheight){
  if ( SVARatio < RatioViewPort) {
// Increase SVAHeight
GLdouble newHeight= SVAWidth/RatioViewPort;
GLdouble yMiddle= ( yBot+yTop )/2.0;
yTop= yMiddle + newHeight/2.0;
yBot= yMiddle - newHeight/2.0;
}
  if ( SVARatio >= RatioViewPort) {
//Increase SVAWidth
GLdouble newWidth= SVAHeight*RatioViewPort;
GLdouble xMiddle= ( xLeft+xRight )/2.0;
xRight= xMiddle + newWidth/2.0;
xLeft=  xMiddle - newWidth/2.0;
  }
  }

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluOrtho2D(xLeft, xRight, yBot, yTop);
}

En línea

- ¡Éste código sin documentar es un galimatías!
- Es tuyo, de hace 3 semanas
- ¡Es una obra maestra aunque esté sin documentar! ¿Qué decías que hace?
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Desface coordenadas eventos ratón (deseperado)
Java
dusttin 3 4,089 Último mensaje 6 Marzo 2010, 20:35
por Leyer
[VBS] ¿Como obtener las coordenadas del ratón?
Scripting
serginmatonis 0 1,290 Último mensaje 8 Febrero 2012, 21:22
por serginmatonis
Error en Ubuntu! Ratón tactil y wifi? « 1 2 »
GNU/Linux
Puntoinfinito 11 4,289 Último mensaje 22 Abril 2012, 20:10
por Puntoinfinito
instalando freeglut en c++
Programación C/C++
rulovive 0 414 Último mensaje 21 Marzo 2014, 02:17
por rulovive
Coordenadas de ratón al pulsar
Java
fileteruso 1 407 Último mensaje 11 Diciembre 2019, 22:07
por fileteruso
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines