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!
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
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!!
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)?
Oops, tienes razón, me equivoqué en el comentario.
Me guíe por mi costumbre de poner siempre paréntesis.
Disculpas. :oops: