iOS使用加速度计在圆圈内移动对象
发布时间:2020-12-14 17:38:00 所属栏目:百科 来源:网络整理
导读:我正在尝试使用加速度计在圆圈内移动图像.我有一个问题,当图像碰到圆的边缘时,它只是移动圆的另一边.我的代码如下: - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {//NSLog(@"x : %g",acceleratio
我正在尝试使用加速度计在圆圈内移动图像.我有一个问题,当图像碰到圆的边缘时,它只是移动圆的另一边.我的代码如下:
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { //NSLog(@"x : %g",acceleration.x); //NSLog(@"y : %g",acceleration.y); //NSLog(@"z : %g",acceleration.z); delta.x = acceleration.x * 10; delta.y = acceleration.y * 10; joypadCap.center = CGPointMake(joypadCap.center.x + delta.x,joypadCap.center.y - delta.y); distance = sqrtf(((joypadCap.center.x - 160) * (joypadCap.center.x - 160)) + ((joypadCap.center.y -206) * (joypadCap.center.y - 206))); //NSLog(@"Distance : %f",distance); touchAngle = atan2(joypadCap.center.y,joypadCap.center.x); NSLog(@"Angle : %f",touchAngle); if (distance > 50) { joypadCap.center = CGPointMake(160 - cosf(touchAngle) * 50,206 - sinf(touchAngle) * 50); } 解决方法
尝试使用CMDeviceMotion实现循环水平仪时,我遇到了同样的问题.我发现传递给atan2(y,x)的坐标是一个问题.此功能需要笛卡尔坐标,视图中心有(0,0).但是,屏幕坐标左上角有(0,0).我创建了在两个坐标系之间转换点的方法,现在它运行良好.
我在github上设置了一个示例项目here,但这是最重要的部分: float distance = sqrtf(((point.x - halfOfWidth) * (point.x - halfOfWidth)) + ((point.y - halfOfWidth) * (point.y - halfOfWidth))); if (distance > maxDistance) { // Convert point from screen coordinate system to cartesian coordinate system,// with (0,0) located in the centre of the view CGPoint pointInCartesianCoordSystem = [self convertScreenPointToCartesianCoordSystem:point inFrame:self.view.frame]; // Calculate angle of point in radians from centre of the view CGFloat angle = atan2(pointInCartesianCoordSystem.y,pointInCartesianCoordSystem.x); // Get new point on the edge of the circle point = CGPointMake(cos(angle) * maxDistance,sinf(angle) * maxDistance); // Convert back to screen coordinate system point = [self convertCartesianPointToScreenCoordSystem:point inFrame:self.view.frame]; } 和: - (CGPoint)convertScreenPointToCartesianCoordSystem:(CGPoint)point inFrame:(CGRect)frame { float x = point.x - (frame.size.width / 2.0f); float y = (point.y - (frame.size.height / 2.0f)) * -1.0f; return CGPointMake(x,y); } - (CGPoint)convertCartesianPointToScreenCoordSystem:(CGPoint)point inFrame:(CGRect)frame { float x = point.x + (frame.size.width / 2.0f); float y = (point.y * -1.0f) + (frame.size.height / 2.0f); return CGPointMake(x,y); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |