2012-04-27 12 views
18

ha estado buscando un operador de mod en ios, al igual que el % en c, pero no tuvo suerte en encontrarlo. Intentó la respuesta en este link pero da el mismo error. Tengo una variable flotante 'rotationAngle' cuyo ángulo sigue incrementándose o decrementándose en función del movimiento de los dedos de los usuarios. algo como esto:El operador de Mod en ios

if (startPoint.x < pt.x) { 
    if (pt.y<936/2) 
     rotationAngle += pt.x - startPoint.x; 
    else 
     rotationAngle += startPoint.x - pt.x; 
    } 
    rotationAngle = (rotationAngle % 360); 
} 

que sólo tiene que asegurarse de que el RotationAngle doesnot cruzar el límite de +/- 360. Cualquier ayuda a cualquier cuerpo. Gracias

+3

Eh, Objective-C se extiende desde C. Por lo tanto, el operador '%' de C también funciona en Objective-C. ** Sin embargo, ** los flotantes no pueden hacer '%', por lo que primero es necesario hacerlo primero. –

Respuesta

40

Puede utilizar fmod (por double) y fmodf (por float) de matemáticas. h:

#import <math.h> 

rotationAngle = fmodf(rotationAngle, 360.0f); 
+1

Gracias pero funciona sin importar math.h también, muy corto y preciso. – nuteron

1

lo eché a un int primera

rotationAngle = (((int)rotationAngle) % 360); 

si quieres más exactitud utilizar

float t = rotationAngle-((int)rotationAngle); 
rotationAngle = (((int)rotationAngle) % 360); 
rotationAngle+=t; 
+0

Esto, por supuesto, perderá al menos algo de precisión. –

+0

No creo que sea suficiente preocuparse a menos que lo esté usando para ingresar a una dirección de viaje para una nave espacial. Si pierde algo en absoluto, creo que no lo hará, no hay redondeo, lanzamiento o devisión, por lo que no lo hará. –

12

Utilice la función fmod, que hace un módulo de coma flotante, para la definición vea aquí: http://www.cplusplus.com/reference/clibrary/cmath/fmod/. Ejemplos de cómo funciona (con los valores de retorno):

fmodf(100, 360); // 100 
fmodf(300, 360); // 300 
fmodf(500, 360); // 140 
fmodf(1600, 360); // 160 
fmodf(-100, 360); // -100 
fmodf(-300, 360); // -300 
fmodf(-500, 360); // -140 

fmodf toma "flotar" como argumentos, fmod toma "doble" y fmodl toma "doble de largo", pero todos hacen lo mismo.

+0

Gracias por su respuesta, esto funciona, el objetivo c es tan diverso, una vez que llama a un método como [self methodName: parameters], la siguiente línea llama a un método como methodName (parameters) .. – nuteron