2012-04-27 18 views
18

szukał operatora mod w ios, podobnie jak % w c, ale nie ma szczęścia w jego odnajdywaniu. Próbowałem odpowiedź w tym link, ale daje ten sam błąd. Mam zmienną zmienną "rotationAngle", której kąt zwiększa się lub zmniejsza w zależności od ruchu palców użytkownika. Niektóre rzeczy tak:Mod operator w 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); 
} 

po prostu trzeba się upewnić, że rotationAngle doesnot przekroczyć +/- 360 limitu. Każda pomoc dla każdego ciała. Dzięki

+3

Eh, Objective-C rozciąga się od C. Zatem operator '%' C działa również w Objective-C. ** Jednak ** floats nie może zrobić '%', więc musisz zrobić int jako pierwszy. –

Odpowiedz

40

Można użyć fmod (dla double) i fmodf (dla float) z matematyki. h:

#import <math.h> 

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

Dziękuję, ale działa bez importowania math.h również, bardzo krótkie i dokładne. – nuteron

1

rzucam go do int pierwszego

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

jeśli chcesz więcej dokładność używać

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

Oczywiście straci to przynajmniej trochę precyzji. –

+0

Nie wydaje mi się, żeby się tym przejmować, chyba że użyjesz go do wejścia w podróż statkiem kosmicznym. Jeśli straci jakąkolwiek wiedźmę, nie sądzę, że tak będzie, nie ma zaokrąglania, rzucania ani projektowania, więc nie będzie. –

12

Użyj funkcji fmod, która wykonuje modulo punktu float, dla definicji patrz tutaj: http://www.cplusplus.com/reference/clibrary/cmath/fmod/. Przykłady, jak to działa (z wartościami powrót):

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 trwa „float” jako argumentów fmod trwa „double” i fmodl trwa „double długi”, ale wszyscy robią to samo.

+0

Dzięki za odpowiedź to działa, cel c jest tak różnorodny, gdy nazwiesz metodę jak [self methodName: parametry], w następnym wierszu wywołasz metodę jak methodName (parametry) .. – nuteron