2012-04-27 13 views
18

haben in Ios nach einem Mod-Operator gesucht, genau wie die % in c, aber kein Glück bei der Suche. Versucht die Antwort in diesem link, aber es gibt den gleichen Fehler. Ich habe eine Gleitkommavariable 'rotationAngle', deren Winkel basierend auf der Fingerbewegung des Benutzers inkrementiert oder dekrementiert. Manche Dinge wie folgt aus:Mod-Operator in 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); 
} 

Ich muss nur darauf achten, dass die Rotation überqueren doesnot die +/- 360 zu begrenzen. Irgendein Körper helfen. Dank

+3

Äh, Objective-C erstreckt sich von C aus. Daher funktioniert Cs "%" Operator auch in Objective-C. ** ** ** Floats können jedoch '%' nicht tun, also müssen Sie es zuerst zu einem int machen. –

Antwort

40

Sie können fmod verwenden möchten (für double) und fmodf (für float) von Mathematik verwenden. h:

#import <math.h> 

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

Danke, aber es funktioniert, ohne math.h auch zu importieren, sehr kurz und präzise. – nuteron

1

Ich warf es in einen int ersten

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

, wenn Sie mehr Genauigkeit

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

Dies wird natürlich zumindest eine gewisse Genauigkeit verlieren. –

+0

Ich glaube nicht, dass es genug ist, um sich Sorgen zu machen, es sei denn, Sie verwenden es, um eine Fahrtrichtung für ein Raumschiff einzugeben. Wenn es überhaupt etwas verliert, was ich nicht glaube, gibt es keine Rundung, Casting oder Trennung, also wird es nicht. –

12

Verwenden Sie die Funktion fmod, die einen floation-point modulo ausführt, zur Definition siehe hier: http://www.cplusplus.com/reference/clibrary/cmath/fmod/. Beispiele dafür, wie es funktioniert (mit den Rückgabewerten):

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 nimmt „float“ als Argumente, fmod nimmt „double“ und fmodl nimmt „Doppel lang“, aber sie alle das gleiche tun.

+0

Danke für deine Antwort das funktioniert, objektive c ist so vielfältig, sobald man eine Methode wie [self methodName: parameters] aufruft, ruft man in der nächsten Zeile eine Methode wie methodName (Parameter) auf. – nuteron