Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





¿en Que Lado Estoy?

Iniciado por marcode, 06 de Febrero de 2006, 05:04:28 PM

« anterior - próximo »

marcode

 Bien, después de leer las opiniones varias veces y de romperme la cabeza en mil cachos ya parece que lo tengo. Calculando la tangente previamente puedo hacer las operaciones sobre cualquier punto con 2 restas y una multiplicación.

Ahora me ha surgido un pequeño problema.

Resulta que dependiendo de la orientación de la línea a veces el resultado da negativo y a veces positivo, creo que depende de si PA es mayor de PB, tanto en su horizontal como en su vertical.

A ver como lo solucionaríais, a ser posible sin crear más if, y por supuesto no añadir una operación más a la comprobación donde irá el bucle. O quizás es que hago algo incorrecto. Este es el código.

PA y PB son los puntos que describen la línea divisoria.


   // se calcula la tangente del angulo de la linea
   float tangente = tan( atan2( PB.y - PA.y, PB.x - PA.x) );
   
   // valores menores de -1 y mayores de 1 son igual a angulos mayores de 45 grados
   if (tangente > -1 && tangente < 1)
   {
       // si el angulo de la linea es menor de 45 grados se comprueba
       // y aqui ira el bucle para comprobar mogollones de puntos
       Punto.bDentro =  tangente * ( Punto.x - PA.x ) < ( Punto.y - PA.y );
       }
   else  
   {
       // si el angulo de la linea es mayor de 45 grados se calcula de nuevo la tangente pero invirtiendo x e y.
       tangente = tan( atan2( PB.x - PA.x, PB.y - PA.y ));

       // y aqui ira el bucle pero invirtiendo tambien x e y
       Punto.bDentro = tangente * ( Punto.y - PA.y ) < ( Punto.x - PA.x );
   }


size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Elvis Enmanuel

 con mi técnica no pasa...

marcode

 Creo que se lo que pasa, pero no se porqué.

Resulta que si PA.x es menor de PB.x la comprobación de <45 grados da invertida pero la de >45 da bien.

y creo que pasa lo mismo pero al reves cuando PA.y es menor de PB.y.

Lo podría solucionar metiendo más if pero no se, debería haber una solución más efectiva.

De todos modos daré por buena cualquier solución con menor coste que esa.

De momento 1 producto y 2 restas. Va a ser difícil superarlo.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

marcode

 Bueno, después de hacer la corrección ya va perfecto, si no hay más remedio lo dejaré así, es igual de efectivo, aunque no me gusta mucho que voy a tener que hacer 4 bucles diferentes cuando los incluya para comprobar muchos puntos de una vez <_<


  float tangente = tan( atan2( PB.y - PA.y, PB.x - PA.x) );

  if (tangente > -1 && tangente < 1)
  {
      if (PA.x < PB.x)
           Punto.bDentro =  tangente * ( Punto.x - PA.x ) < ( Punto.y - PA.y );
      else
           Punto.bDentro =  tangente * ( Punto.x - PA.x ) > ( Punto.y - PA.y );
  }
  else  
  {
      tangente = tan( atan2( PB.x - PA.x, PB.y - PA.y ));

      if (PA.y > PB.y)
           Punto.bDentro = tangente * ( Punto.y - PA.y ) < ( Punto.x - PA.x );
      else
           Punto.bDentro = tangente * ( Punto.y - PA.y ) > ( Punto.x - PA.x );
  }


Como se ve, la comprobación es solo para invertir el signo de la operación, si alguien sabe como evitar esos "if".....

gracias por la ayuda  :)
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.