2016-06-03 1 views
0

Я сделал синий шар, который можно таскать по пользователя только на красный круг путь: enter image description hereВычислить, сколько кругов пользователь сделал в круге Путь

Я хочу, чтобы проверить, сколько раз пользователь делает передний или задний круг (начало & конец находится в верхней части кругового пути), например - если он перетаскивает мяч по часовой стрелке, так что кружки равны +1, и если он перетащит его другим способом, кругов -1.

Я пытался сделать это (Это inculdes перетаскивания мяча и моя попытке сосчитать круги):

@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) 
      } 
    } 

И это сработало! но когда пользователь перетаскивает мяч очень быстро, он не вычисляет, и он не вычисляет назад.

+2

Вместо проверки на 0, вы можете сделать угол суммирование, а затем разделить его на 360, чтобы получить число спинов. В принципе, не переустанавливайте угол, а просто накапливайте угол в переменной. –

+0

@EugeneZhenyaGordin Можете ли вы привести мне пример? – Eliko

+0

ok ... так что скажите, что вы начинаете с 0 по часовой стрелке, когда вы снова попадаете в ту же точку, а не заново, просто продолжайте добавлять градусы, 385 ... 450 и т. Д., Если вы идите против часовой стрелки, вычтите. когда касания закончатся, устройство на 360, и вы получите количество спинов, если это значение отрицательно, значит, вы шли против часовой стрелки. –

ответ

2

Вот возможное решение, следуя подходу, указанному в комментариях. Прежде всего, необходимо несколько дополнительных переменных экземпляра:

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

В dragBall, вы подсчитать, сколько угол изменился. Так как угол может «прыгать» от -π к я, или наоборот, разница нормируется в диапазоне -π ... π:

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

Затем обновите общее изменение угла:

totalAngle += delta 

и от этого вы можете определить количество кругов:

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

Еще раз спасибо сегодня Мартин! Думаю, сегодня это не мой математический день (: – Eliko