Как отслеживать общее количество полных поворотов изображения в приложении для iOS? - PullRequest
2 голосов
/ 11 января 2012

Я работаю над приложением, у которого есть вращающееся изображение (пользователь нажимает и тащит, а изображение вращается по кругу, следя за своим пальцем). Я пытаюсь отследить, сколько раз пользователь совершил полный круг. Дополнительным «затруднением» является то, что мне также необходимо знать, вращается ли пользователь по часовой стрелке против часовой стрелки.

Вот код, который вращает изображение ... Пожалуйста, не стесняйтесь запрашивать дополнительную информацию.

   - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];

    long double rotationNumber = atan2(touchPoint.y - originY, touchPoint.x - originX);

    totalRotationCount ++;

    schedulingWheel.transform = CGAffineTransformMakeRotation(rotationNumber);

    offset = (rotationNumber * 100)/14;

    dateRibbon.center = CGPointMake(offset, 24);  
}

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 17 января 2012

Мое решение не элегантное, и, может быть, мне не хватает более чистого решения, но это то, что я сделал недавно.Хитрость заключается в том, чтобы отслеживать угол с момента последнего вызова touchesMoved:.Затем добавьте дельту вашего текущего угла и сохраненное значение ангела к вашему итогу.

Проблема в «границах», которые atan2 создает необходимый уродливый код для преодоления.Скажем, ваше lastAngle равно 359, и вы пересекаете исходную точку, поэтому ваш следующий угол равен 1. Разница будет не равной 2, а -358, поэтому при каждом пересечении этой границы ваше общее значение будет сбрасываться в 0.

Вот что я сделал:

 CGFloat angle = atan2f(center.y - point.y, point.x - center.x);

 //Translate to Unit circle
 if (angle > 0) {
     angle = (M_PI - angle) + M_PI;
 } else {
     angle = fabsf(angle);
 }

 CGFloat delta = angle - lastAngle;

 //Adjust for boundaries
 if (fabsf(delta) > (2*M_PI)-fabsf(delta)) {
      BOOL greaterThanZero = (delta > 0);
      delta = (2*M_PI)-fabsf(delta);
      if (greaterThanZero) {
           delta = -1 * delta;
      }
  }

  totalAngle += delta;
  lastAngle = angle;

Большое / безобразное условие в разделе «Корректировка границ» в основном просто смотрит, есть ли более короткий угол, чтобы добраться до новой точки (так, 2 вместо -258) & предполагает, что если оно есть, это, вероятно, означает, что вы пересекли это начало и соответственно изменили дельту.

Я перевел результаты Atan2 так, чтобы они представляли полный единичный круг от 0 до 2π.Бонус побочный эффект, он тогда учитывает движение по часовой стрелке / против часовой стрелки лучше, чем стандартное от -π до π Atan2.

0 голосов
/ 11 января 2012

Чтобы узнать, каково общее число вращений, просто сложите все углы поворота в обоих направлениях. Для по часовой стрелке значение угла поворота будет положительным, а для против часовой стрелки - отрицательным. Затем разделите его на число пи (~ 3,14), чтобы получить общее количество вращений.

long double rotationNumber = atan2(touchPoint.y - originY, touchPoint.x - originX);
long double totalRotationsAngle += rotationNumber;

Тогда всякий раз, когда вы хотите получить количество полных вращений:

double numberOfRotations = floor(totalRotationsAngle/M_PI);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...