2016-06-03 4 views
0

ich einen blauen Ball gemacht habe, die vom Benutzer gezogen werden kann nur auf einem roten Kreis Pfad: enter image description hereberechnet, wie viele Runden der Benutzer hat in einer Kreisbahn

ich wie oft überprüfen möge die Benutzer machen eine Vorwärts - oder Rückwärtsrunde (der Anfang & Ende ist an der Spitze des Kreisweges), zum Beispiel - Wenn er den Ball im Uhrzeigersinn zieht, so ist die Runde +1, und wenn er ihn auf eine andere Weise zieht Runden ist -1.

Ich habe versucht, dies zu tun (Diese Inculdes das Ziehen des Balles und mein Versuch Runden zählen):

@IBAction func dragBall(recognizer: UIPanGestureRecognizer) { 
     let point = recognizer.locationInView(self.view); 
     let earthX = Double(point.x) 
     let earthY = Double(point.y) 
     let midViewXDouble = Double(midViewX) 
     let midViewYDouble = Double(midViewY) 
     let angleX = (earthX - midViewXDouble) 
     let angleY = (earthY - midViewYDouble) 
     let angle = atan2(angleY, angleX) 
     let earthX2 = midViewXDouble + cos(angle)*100 
     let earthY2 = midViewYDouble + sin(angle)*100 
     circlePath2 = UIBezierPath(arcCenter: CGPoint(x: earthX2,y: earthY2), radius: CGFloat(10), startAngle: CGFloat(0), endAngle:CGFloat(M_PI * 2), clockwise: true) 
     shapeLayer2.path = circlePath2.CGPath 

    if degrees == 0 { 
       laps += 1 
       print(laps) 
      } 
    } 

Und es hat funktioniert! aber wenn der Benutzer den Ball sehr schnell schleppt, berechnet er nicht und berechnet nicht rückwärts.

+2

Statt für 0 zu prüfen, können Sie Winkel Summierung tun und dann teilen sie durch 360, die Anzahl der Spiele zu erhalten. Verkleinern Sie den Winkel grundsätzlich nicht, sondern akkumulieren Sie einfach den Winkel in einer Variablen. –

+0

@EugeneZhenyaGordin Können Sie mir ein Beispiel geben? – Eliko

+0

ok ... also sagen Sie, Sie beginnen von 0 im Uhrzeigersinn, wenn Sie wieder an den gleichen Punkt statt Null kommen Sie einfach weiter die Grad hinzufügen, 385 ... 450 usw. Wenn Sie gegen den Uhrzeigersinn gehen, subtrahieren. wenn die Berührungen beendet sind, Gerät um 360 und du wirst die Anzahl der Spins erhalten, wenn dieser Wert negativ ist, bedeutet das, dass du gegen den Uhrzeigersinn gehst. –

Antwort

2

Hier ist eine mögliche Lösung, die dem in den Kommentaren angegebenen Ansatz folgt. Zuerst müssen Sie einige zusätzliche Instanzvariablen:

var previousAngle = -M_PI_2 // top position if y-coordinate points down 
var totalAngle = 0.0 
var laps = 0 

In dragBall, Sie berechnen, wie viel der Winkel verändert hat. Da der Winkel „Sprung“ von -π bis & pgr; können, oder umgekehrt, ist die Differenz auf den Bereich -π normalisierten ... π:

var delta = angle - previousAngle 
if delta > M_PI { 
    delta -= 2 * M_PI 
} else if delta < -M_PI { 
    delta += 2 * M_PI 
} 
previousAngle = angle 

dann ist die gesamte Änderung des Winkels aktualisieren:

totalAngle += delta 

und davon, dass Sie die Anzahl der Runden bestimmen kann:

laps = Int(floor(totalAngle/(2 * M_PI))) 
+0

Nochmals vielen Dank Martin! Ich denke es ist heute nicht mein Mathe-Tag (: – Eliko

Verwandte Themen