Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Como saber si un poligono es convexo.

Iniciado por MChiz, 04 de Diciembre de 2002, 11:40:41 AM

« anterior - próximo »

MChiz

                                Hola!

Me podriais ayudar con esto, porfavor? No entiendo porque no me funciona... la funcion acosf me devuelve, como mucho ( cuando los dos vectores estan en linea ) 180. Es decir, siempre me coge el angulo mas pequeño entre los vectores. :llorando:  :oops:


bool isPolygonConvex( const Vector3D *polygon, int numVectors ) {

 numVectors += 1;



for( int i = 0; i < numVectors; ++i ) {

 Vector3D v1 = polygon[ i ] - polygon[ ( i + 1 ) % numVectors ],

    v2 = polygon[ ( i + 2 ) % numVectors ] - polygon[ ( i + 1 ) % numVectors ];



 float magnitude = v1.magnitude( ) * v2.magnitude( );

 

 assert( magnitude <= EPSILON || magnitude >= EPSILON );



 float alpha = ( v1 * v2 ) / magnitude;



 float angle = acosf( alpha ) / 6.28f * 360.0f;



 if( angle > 180.0f )

  return false;

}



return true;

}



Muchisimas gracias!                                

Juan Mellado

Vamos a animar este post, que se ha quedado un poco muerto (a lo mejor ya lo has resuelto):



assert( magnitude <= EPSILON || magnitude >= EPSILON );



Suponiendo que EPSILON es un real, ¿qué número no cumple esta condición?.

Todo número es menor o igual que EPSILON o mayor o igual que EPSILON.

Supongo que querías poner -EPSILON en la parte izquierda.



float angle = acosf( alpha ) / 6.28f * 360.0f;



Suponiendo que acosf(alpha) devuelve un valor en radianes, entonces ¿el propósito de 6.28f*360.0f es convertirlos a grados?

Si no me falla la regla del tres, debería ser: grados = (radianes * 360) / (2 * PI)

Si te fijas, cuando radianes = 2 * PI, la expresión devuelve 360 grados.

Depura paso a paso, y observa como varía el valor de las variables (ya sé, me repito un poco en mis consejos)

Saludos, y suerte

MChiz

                                Gracias por contestar ^_^
No he arreglado aun el problema. En lo del assert tienes razon, queria poner -EPSILON. Es para no dividir entre 0.
mmm... mirare todo lo que me dices, muchas gracias!!                                

jpastor

                               
Citar

float angle = acosf( alpha ) / 6.28f * 360.0f;



Suponiendo que acosf(alpha) devuelve un valor en radianes, entonces ¿el propósito de 6.28f*360.0f es convertirlos a grados?

Si no me falla la regla del tres, debería ser: grados = (radianes * 360) / (2 * PI)

Si te fijas, cuando radianes = 2 * PI, la expresión devuelve 360 grados.

mmm, ¿cual es la diferencia entre los dos (sin contar con la aproximacion de 2*PI)?                                

Juan Mellado

                                Oops, tienes razón, me equivoqué en el comentario.

Me guíe por mi costumbre de poner siempre paréntesis.

Disculpas. :oops:                                






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.