Исчисление для преобразования координат Y с целью обновления bpm в метрономе

Я нахожусь в разработке метронома для iPad. Я использую CGAffineTransformRotate для анимации metronomeArm , NSTimer (меня не интересует большая точность) для звука и UIPanGestureRecognizer для перетаскивания metronomeWeight на metronomeArm . введите описание изображения здесь

Моя проблема в том, что я не знаю, как обновить bpm, перетащив вес с помощью панорамирования. На данный момент у меня это: metronomeWeight.center.y – 240, а по умолчанию для этой позиции – 80. Вес от 140 до 450. Я реализовал этот метод, но это неверно:

 -(void)updateBPM { CGFloat weightYPosition = metronomeWeight.center.y; NSUInteger newBPM = (weightYPosition/3); self.bpm = newBPM; } 

и селектором для кастрюли является следующее:

 -(void)handlePan:(UIPanGestureRecognizer*)gesture { CGPoint translation = [gesture translationInView:metronomeArm]; CGPoint location = [gesture locationInView:metronomeArm]; NSLog(@"miscarea pe oy are valoare de: %f", location.y); CGPoint newCenter = CGPointMake(metronomeArm.frame.size.width/2, gesture.view.center.y + translation.y ); if (newCenter.y >= 140 && newCenter.y <= 450) { gesture.view.center = newCenter; [gesture setTranslation:CGPointZero inView:metronomeArm]; [self updateBPMFromWeightLocation]; tempoLabel.text = [NSString stringWithFormat:@"%d", self.bpm]; NSLog(@"metronomeWeight position : %f ",metronomeWeight.center.y); } } 

Обновление звука и анимации, но не по желанию, что означает, что нижний предел bpm должен быть 225, а верхний – 1. В моем случае они равны 150 и 46 соответственно.

Мои расчеты не очень хорошие, так что это будет фантастика, если вы можете помочь мне решить эту проблему … Я смотрел на проект метронома яблока в течение нескольких дней и не могу понять, как они это делают …

благодаря

Новый метод updateBPM благодаря предложению @zimmryan

 -(void)updateBPMFromWeightLocation { CGFloat weightYPosition = metronomeWeight.center.y; float lengthInM = ((weightYPosition - 140) * 0.00041333); float time = 2 * M_PI * sqrt(lengthInM / 9.8); NSUInteger newBPM = floor(60.0 / time); self.bpm = newBPM; } 

Из моего понимания физики и исчисления уравнение для периода маятника составляет T = 2pi sqrt (l / g), где T – время в секундах, l – длина в метрах, g – гравитация.

Вы выбираете базовую точку 290 (пиксели) и BPM 120. BPM из 120 преобразуется в период 0,5 секунды. Итак, T = .5. Решая уравнение, вы получаете 0,062 для l или 6,2 см.

Но ваша длина не в см, а в пикселях теперь вы должны ее преобразовать. Поскольку ваш диапазон составляет от 140 до 350, ваша нулевая точка равна 350. Итак, сначала вы берете 350 – 390, чтобы получить смещение 60. Теперь создайте свое уравнение 60 пикселей * k = .062, так что ваш k = .001033

Ваша конечная функция должна читать

 -(void)updateBPM { CGFloat weightYPosition = metronomeWeight.center.y; float lengthInM = ((350 - weightYPosition) * .001033); float time = 2 * M_PI * sqrt(lengthInM / 9.8); NSUInteger newBPM = floor(60 / time); self.bpm = newBPM; } 

или

 -(void)updateBPM { self.bpm = floor(60 / (2 * M_PI * sqrt(((350 - metronomeWeight.center.y) * .001033) / 9.8))); } 
  • неожиданное окно nil в _UIApplicationHandleEventFromQueueEvent, _windowServerHitTestWindow
  • реализовать панораму в стиле посыльного Facebook в полноэкранном режиме аналогичный эффект
  • Позиция указателя iOS UIPanGestureRecognizer
  • Определите, когда UIView перетаскивается поверх UICollectionViewCell
  • Использование UIPanGestureRecognizer для поворота UIView вокруг определенной точки
  • ios - зажмите / увеличьте изображение, сфокусированное на касаниях
  • Как ограничить перемещаемое представление с помощью жесты «Пан»
  • UIPanGestureRecognizer делает что-то сразу при касании
  • Как я могу применить угловой импульс к узлу набора Sprite на основе скорости жесты панорамы
  • Добавление UIPanGestureRecognizer и UISwipeGestureRecognizer в том же самом представлении вызывает конфликты после установки requireGestureToFail
  • Как проверить жест порта не перемещен
  • Давайте будем гением компьютера.