gpt4 book ai didi

ios - 为更新节拍器中的 bpm 而转换 Y 坐标的微积分

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:15 26 4
gpt4 key购买 nike

我正在为 iPad 开发节拍器。我使用 CGAffineTransformRotate 制作 metronomeArm 动画,使用 NSTimer(我对高精度不感兴趣) 制作声音,使用 UIPanGestureRecognizer 拖动节拍器臂上的节拍器重量。 enter image description here

我的问题是我不知道如何通过使用平移拖动重量来更新 bpm。现在我有这个:metronomeWeight.center.y 是 240,这个位置的默认 bpm 是 80。重量从前 140 到最大 450。我已经实现了这个方法,但它是不正确:

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

pan 的选择器是这样的:

-(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。

我的计算能力不好,所以如果你能帮我解决这个问题就太好了......我看了几天apple的节拍器项目,不明白他们是怎么做到的......

谢谢

感谢@zimmryan 建议的新 updateBPM 方法

-(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(像素)的基点和 120 的 BPM。120 的 BPM 转换为 0.5 秒的周期。所以 T = .5。求解方程式,l 为 0.062,即 6.2cm。

但你的长度不是以厘米为单位,而是以像素为单位,现在你必须转换它。由于你的范围是从 140 到 350,你的零点是 350。所以首先你取 350 - 390 得到 60 的偏移量。现在创建你的 60pixels * 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)));
}

关于ios - 为更新节拍器中的 bpm 而转换 Y 坐标的微积分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16566805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com