Ребята из Apple дают иллюстрацию того, как "сгладить" необработанные данные, поступающие с акселерометра в документах:
#define kFilteringFactor 0.1
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:
(UIAcceleration *)acceleration {
// Use a basic low-pass filter to keep only the gravity component of each axis.
accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor));
accelY = (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor));
accelZ = (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor));
}
Как только у вас есть поток данных, просто измените дельтакс, дельту, которую вы имеете для набора изображений, в пределах некоторого минимального / максимального диапазонов, и измените положение каждого UIImageView, например:
// in your @interface somewhere
float deltax, deltay;
UIView* ivs[9];
// in your @implementation
#define MINXDELTA (-40)
#define MAXXDELTA (+40)
#define MINYDELTA (-40)
#define MAXYDELTA (+40)
#define SPEEDFACTOR (5)
#define kFilteringFactor 0.1
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:
(UIAcceleration *)acceleration {
// Use a basic low-pass filter to keep only the gravity component of each axis.
accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor));
accelY = (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor));
accelZ = (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor));
deltax+=accelX*SPEEDFACTOR; deltay+=accelY*SPEEDFACTOR;
if (deltax<MINXDELTA) deltax=MINXDELTA;
if (deltay<MINYDELTA) deltay=MINYDELTA;
if (deltax>MINXDELTA) deltax=MINXDELTA;
if (deltay>MINYDELTA) deltay=MINYDELTA;
[self positionImages];
}
// call this from init too
-(void)positionImages {
// assumes you have 9 images arranged as 3x3 on 40 pixel grid centered at 100,100
for (ix=0; ix<3; ix++) for (iy=0; iy<3; iy++) {
UIImageView *iv=ivs[ix+iy*3];
CGPoint c=CGMakePoint(100-40+40*ix, 100-40+40*iy);
iv.center=c;
}
}
EDIT
Некоторые незначительные опечатки выше.
UIView* ivs[9];
должно быть
UIImageView* ivs[9];
и
if (deltax>MINXDELTA) deltax=MINXDELTA;
if (deltay>MINYDELTA) deltay=MINYDELTA;
должно быть
if (deltax>MAXXDELTA) deltax=MAXXDELTA;
if (deltay>MAXYDELTA) deltay=MAXYDELTA;
Достаточно указателя / Я оставлю его там, я думаю.