1

みなさん、こんにちは。ユーザーが画面上のオブジェクトをドラッグできるiOSアプリへのタッチインターフェイスを作成したいと思います。ただし、このオブジェクトは円の周囲に沿って移動するように制限する必要があります。これにより、ユーザーがオブジェクトをそのパスの外側にドラッグしようとすると、そのオブジェクトはその円の最も近い点に固定されます。私はいくつかのiPhoneプログラミングをしましたが、私の数学は貧弱です。助けてください!

4

1 に答える 1

1

あなたがしなければならないのは、円の方程式に従うようにビューのフレームを設定することです(形式:) (x-a)^2 + (y-b)^2 = r^2。タッチポイントを検出したら、タッチポイントのx座標またはy座標に従ってビューのフレームを制限できます(どちらの方法も同じです)。

#define circleRadius 60.0 // r in the above eqtn
#define circlesCenter_X 160.0 // a in the above eqtn
#define circlesCenter_Y 200.0 // b in the above eqtn
#define circleCenter_y(x) sqrtf(circleRadius*circleRadius - (x-circlesCenter_X)*(x-circlesCenter_X))

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [[event touchesForView:firstPieceView] anyObject];
    CGPoint previousLocation = [touch previousLocationInView:self.view];
    CGPoint location = [touch locationInView:self.view];
    CGFloat delta_x = previousLocation.x - location.x; // constrained by x in this eg.
    CGFloat newX = firstPieceView.center.x-delta_x;
    // do limit the view's x-coordinate for possible solutions
    if(newX<circlesCenter_X - circleRadius)
        newX = circlesCenter_X - circleRadius;
    if(newX>circlesCenter_X + circleRadius)
        newX = circlesCenter_X + circleRadius;
    firstPieceView.center = CGPointMake(newX, circleCenter_y(newX)*(location.y>=circlesCenter_Y?1:-1) + circlesCenter_Y);
}

編集-より良い解決策:

#define circleRadius 60.0 // r in the above eqtn
#define circlesCenter_X 160.0 // a in the above eqtn
#define circlesCenter_Y 200.0 // b in the above eqtn
#define slope(x,y) (y-circlesCenter_Y)/(x-circlesCenter_X)
#define pointOnCircle_X(m) circleRadius/(sqrtf(m*m + 1))

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [[event touchesForView:self.view] anyObject];
    CGPoint location = [touch locationInView:self.view];
    CGFloat slope;
    CGPoint pointOnCircle;
    if(location.x==circlesCenter_X){// case for infinite slope
        pointOnCircle.x = circlesCenter_X;
        if(location.x<circlesCenter_X){
            pointOnCircle.y = circlesCenter_Y - circleRadius;
        }else{
            pointOnCircle.y = circlesCenter_Y + circleRadius;
        }
    }else{
        slope = slope(location.x,location.y);
        if(location.x<circlesCenter_X){
            pointOnCircle.x = circlesCenter_X - pointOnCircle_X(slope);
        }else{
            pointOnCircle.x = circlesCenter_X + pointOnCircle_X(slope);
        }
        pointOnCircle.y = slope * (pointOnCircle.x - circlesCenter_X) + circlesCenter_Y;
    }
    firstPieceView.center = pointOnCircle;
}

これは、、などにも同様に適用できAndroidますBlackberry

于 2012-08-28T09:44:25.700 に答える