Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 微积分转换Y坐标以更新节拍器中的bpm_Ios_Objective C_Math_Coordinates_Uipangesturerecognizer - Fatal编程技术网

Ios 微积分转换Y坐标以更新节拍器中的bpm

Ios 微积分转换Y坐标以更新节拍器中的bpm,ios,objective-c,math,coordinates,uipangesturerecognizer,Ios,Objective C,Math,Coordinates,Uipangesturerecognizer,我正在为iPad开发节拍器。我正在使用CGAffineTransformRotate制作metronomeArm动画,NSTimer(我对高精度不感兴趣)制作声音,UIPangestureRecognitor在metronomeArm上拖动metronomeWeight 我的问题是,我不知道如何通过使用平移拖动权重来更新bpm。现在我有了这个:metronomeWeight.center.y是240,这个位置的默认bpm是80。权重从前140到最大450。我已实施此方法,但它不正确: -(voi

我正在为iPad开发节拍器。我正在使用CGAffineTransformRotate制作metronomeArm动画,NSTimer(我对高精度不感兴趣)制作声音,UIPangestureRecognitor在metronomeArm上拖动metronomeWeight

我的问题是,我不知道如何通过使用平移拖动权重来更新bpm。现在我有了这个:
metronomeWeight.center.y
是240,这个位置的默认bpm是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);
    }
}

根据我对物理学和微积分的理解,摆周期的方程是T=2pi sqrt(l/g),其中T是以秒为单位的时间,l是以米为单位的长度,g是重力

您选择的基点为290(像素),BPM为120。120的BPM转换为0.5秒的周期。所以T=0.5。解你得到的方程,l为0.062,或6.2cm

但是你的长度不是厘米,而是像素,现在你必须转换它。因为你的范围是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;
}


你尝试过我的解决方案吗?@zimmryan你好,非常感谢你的配方!我现在就去试试,我不在家。我必须稍微修改一下,因为我的范围是140到450(编辑我的问题以反映这一点),我希望基点240的默认bpm为80,而不是120。我会让你知道发生了什么,一旦我实施,再次感谢!希望它能起作用,这是一个有趣的尝试,我决定将默认速度设置为120,这样我的基点将从240变为290,这意味着我得到了150的偏移量,因此我的k将为.00041。我已经实现了这个方法,但当我拖动权重时,一切都是颠倒的:如果我向上拖动权重,当它应该减少时,节奏会增加,当它应该增加时,节奏会减少,除此之外,它从225变为84,而不是1。@QuiBongJin我误解了你的轴心点在哪里。因为它位于底部,所以我编辑了我的answer@QuiBongJin在iOS/Cocos2d中
-(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)));
}