2

画像を中心点を中心に回転させたいです。私が直面している問題は、タッチ移動イベントで計算する角度を取得する必要があることです(マルチタッチを使用したくない)。現在、以下のコードを使用しています

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

NSArray *allTouches = [touches allObjects]; 
gestureStartPoint = gestureMovedPoint;//i am getting the gestureStartPoint on touch began event

gestureMovedPoint = [[allTouches objectAtIndex:0] locationInView:[self superview]];

NSLog(@"gestureMovedPoint = %@",NSStringFromCGPoint(gestureMovedPoint));

}

CGFloat previousAngle = [self angleBetweenPoints:gestureStartPoint second11:gestureMovedPoint]; // atan2(gestureMovedPoint.y - gestureStartPoint.y, gestureMovedPoint.x - gestureStartPoint.x) * 180 / M_PI;
CGFloat currentAngle =atan2(self.transform.b, self.transform.a);//atan2(gestureMovedPoint.y - gestureStartPoint.y,gestureMovedPoint.x - gestureStartPoint.x) * 180 / M_PI;



CGFloat angleToRotate = currentAngle - previousAngle;



float xpoint = (((atan2((gestureMovedPoint.x - gestureStartPoint.x) , (gestureMovedPoint.y - gestureStartPoint.y)))*180)/M_PI);

    CGAffineTransform transform = CGAffineTransformMakeRotation(angleToRotate-100);



self.transform = transform;

私はここで立ち往生していて、締め切りがあるとすぐにこのアプリケーションを完了する必要があるので、親切に私が解決策を見つけるのを手伝ってください。前もって感謝します

4

3 に答える 3

2

トリジノメトリーを覚えてよかった


-(void)degreesToRotateObjectWithPosition:(CGPoint)objPos andTouchPoint:(CGPoint)touchPoint{

   float dX = touchPoint.x-objPos.x;        // distance along X
   float dY = touchPoint.y-objPos.y;        // distance along Y
   float radians = atan2(dY, dX);          // tan = opp / adj

   //Now we have to convert radians to degrees:
   float degrees = radians*M_PI/360;

   return degrees;
}

素敵なメソッドができたら、toucheventメソッドでこれを実行します。(私はそれが何と呼ばれるかを忘れました...)

CGAffineTransform current = view.transform;

[view setTransform:CGAffineTransformRotate(current,
[self degreesTorotateObjectWithPosition:view.frame.origin
andTouchPoint:[touch locationInView:parentView]] //Note: parentView = The view that your object to rotate is sitting in.

これはあなたが必要とするほとんどすべてのコードです。数学は正しいですが、私はsetTransformのものについてはよくわかりません。私は学校でこれをブラウザで書いています。ここから理解できるはずです。

幸運を、

オーラムアクイラ

于 2011-02-24T10:05:31.993 に答える
0

これで考えなければなりません。しかし、私は2つのタッチでビューを回転させることを好みます。それははるかに簡単になります。

于 2011-02-24T10:03:12.347 に答える
0

使用しているコードを100%理解したいので、タッチ駆動の回転を取得する方法に少し苦労しました。それで、私は何度も失敗した後、これで終わりました:

- (CGFloat) pointToAngleFromCenter: (CGPoint) point {
    // transform point to a self.center'ed origin based coordinate system
    point.x = point.x - self.center.x ;
    // ditto for y, but compensate for y going downwards to y going upwards
    point.y = self.center.y - point.y ;
    return ::atan2(point.y, point.x) ;
}

誰かがこの方法のより良い名前を持っているなら、私はすべての耳です。

これは、親ビュー座標内のポイントを取得し、ビューの中心(親ビュー座標内)を基準にして再マップし、この再マップされたポイントと軸[0X]の間の角度を計算します。そうするために、yを通常の数学座標に正規化します(yは、値が減少するとではなく、増加すると増加します)。したがってself.center.y - point.y、その逆ではありません。

最後に、touchesMovedで:

- (void) touchesMoved: (NSSet *) touches withEvent: (UIEvent *) event {
    UITouch * touch = [touches anyObject] ;

    CGFloat currA = [self pointToAngleFromCenter:[touch locationInView:self.superview]] ;
    CGFloat prevA = [self pointToAngleFromCenter:[touch previousLocationInView:self.superview]] ;
    // the current value of the rotation angle
    CGFloat tranA = ::atan2(self.transform.b, self.transform.a) ;
    // the angle difference between last touch and the current touch
    CGFloat diffA = currA - prevA ;
    // the new angle resulting from applying the difference
    CGFloat angle = tranA - diffA ;

    CGAffineTransform t = ::CGAffineTransformMakeRotation(angle) ;

    self.transform = t ;
    [self setNeedsDisplay] ;
}
于 2012-03-20T12:20:03.087 に答える