我在处理加速度计数据的图形,正在尝试纠正重力影响。为此,我获取球坐标系下的加速向量,将半径减去1g,然后转换回直角坐标系。这种方法每0.03秒定时调用一次:
//poll accleration
ThreeAxisAcceleration current = self.accelerationData;
//math to correct for gravity:
float radius = sqrt(pow(current.x, 2) + pow(current.y, 2) + pow(current.z, 2));
float theta = atan2(current.y, current.x);
float phi = acos(current.z/radius);
//NSLog(@"SPHERICAL--- RADIUS: %.2f -- THETA: %.2f -- PHI: %.2f", radius, theta, phi);
radius = radius - 1.0;
float newX = radius * cos(theta) * sin(phi);
float newY = radius * sin(theta) * sin(phi);
float newZ = radius * cos(phi);
current = (ThreeAxisAcceleration){newX, newY, newZ};
//end math
NSValue *arrayVal = [NSValue value:¤t withObjCType:@encode(ThreeAxisAcceleration)];
if ([_dataHistoryBuffer count] > self.bounds.size.width) {
[_dataHistoryBuffer removeObjectAtIndex:0];
}
[_dataHistoryBuffer addObject:arrayVal];
[self setNeedsDisplay];
一些问题困扰着我,加入重力校正后我的代码变得越来越慢。我很难相信这么少的计算会拖慢程序,但是如果不加它,我的整个显示方法仍然可以运行,尽管它非常冗长。有没有什么选项可以考虑以避免这种情况?我是否漏掉了什么或者数学计算真的很慢吗?我可以在//math和//end math标签之间注释掉它并且完全没问题。
感谢任何帮助。
附言:如果有必要,可能会对某些人感兴趣,我正在使用Cocoa编程,而这个方法属于CALayer的子类,并实现了-drawInContext:。