我想在UIAccelerometer课上提供一些帮助。我想找到一些方法来找出或区分我从右到左和从左到右挥动iphone设备。我得到x,y,z值以及间隔值。我也从正常的物理规则中得到速度和距离。
距离=(prevDist + sqrt(pow((prevx - acceleration.x),2)+ pow((prevy - acceleration.y),2)+ pow((prevz - acceleration.z),2)))
Velocity =(Distance * timeintercal){此处距离表示该距离的newdistance-prevdistance和timeinterval}
当我从右向左移动iphone设备然后从左到右移动时,我会定期以两个方向和速度进行总距离传输。你能帮我解决一下我是如何从左到右或从右到左移动iphone设备的?
帮助将不胜感激。 感谢。
答案 0 :(得分:1)
首先,您有一些物理错误。您的distance
不是“距离”变量,因为您要从加速度计求加速度值。此外,您的velocity
实际上是一个'速度'变量,因为您将加速度乘以一个时间间隔。
您真正想要做的是监控加速度x,以获取超过某个预定幅度的值。这个幅度应该足够低,以至于用户不必猛烈摆动iPhone,但足够高,以至于简单的动作不会超过你的门槛。如果acceleration.x大于0超过预定阈值或更高,那么您正在加速。如果按预定量或更多量加速度小于0,则表示您正在加速。
在一段时间内确定手机的速度要困难得多,因为您必须连续整合加速度值。 iPhone加速度计不是非常精确,可能会很嘈杂,因此在一小段时间后,您的应用程序可能会确信您的手机正在随机漂移。另外,请记住,重力将始终显示在加速度值中。
答案 1 :(得分:1)
这取决于用户持有设备的方式。 您不需要速度或距离来确定设备摆动的方向。 相反,您可以保留过去(比如5)加速度的历史记录。 假设设备保持正常方式(纵向,正面向上),您将使用先前x加速度的平均值来确定方向。
基本上我所做的就是加速度计:didAccelerate事件:
//prevAccels is an NSMutableArray
float VAL = .75;
int HISTORY_NUMBER = 5;
if (accleration.x>VAL && acceleration.y>VAL){ //if there has been a sudden jerking motion
float avgX;
for (int i = 0; i<[prevAccels count]; i++)
{
UIAcceleration *a = [prevAccels objectAtIndex:i];
avgX += a.x;
}
avgX /= HISTORY_NUMBER; //get the average of the previous accelerations
BOOL flickRight = (avgX<-VAL)?YES:NO;
//[self wave:flickRight]; //do stuff here
}
[prevAccels addObject:acceleration]; //add the acceleration to the history
if ([prevAccels count]>HISTORY_NUMBER) [prevAccels removeObjectAtIndex:0]; //trim the list if it is too large
希望有所帮助!
答案 2 :(得分:0)
要记住的一件事是重力总是影响加速度计,因此需要考虑。不幸的是,你不能指望直接计算距离和实际速度的方法,因为在“向下”的任何时刻都不知道。
要注意当“向左摆动”或“向右摆动”发生时,还要考虑到机芯可能处于弧形,并且当摆动停止时,您将获得相反的加速度。要知道摆动正在进行中,请查看“out”加速度矢量,例如指向远离旋转中心的那个。使用它可以区分“开始移动”状态和“停止移动状态”,否则将具有相等但相反的加速度值。