Рассчитать угол поворота в круговой диаграмме - PullRequest
2 голосов
/ 24 февраля 2011

Я хочу повернуть изображение вокруг его центральной точки. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно получить угол для вычисления события касания с перемещением (я не хочу использовать мультитач). 1001 *

- (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;

Пожалуйста, помогите мне найти решение, так как я застрял здесь, и мне нужно заполнить это заявление очень скоро, как только наступит тупик. Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 24 февраля 2011

Рад, что помню тригонометрию


-(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;
}

Как только у вас есть хороший метод, просто сделайте это в методе сенсорного события.(Я забыл, как это называется ...)

CGAffineTransform current = view.transform;

[view setTransform:CGAffineTransformRotate(current,<br>                 [self degreesTorotateObjectWithPosition:view.frame.origin <br>                                  andTouchPoint:[touch locationInView:<b>parentView</b>]]

//<b>Note: parentView = The view that your object to rotate is sitting in.</b>

Это почти весь код, который вам понадобится. Математика верна, но я не уверен насчет вещей setTransform.Я в школе пишу это в браузере.Вы должны быть в состоянии понять это отсюда.

Удачи,

Aurum Aquila

0 голосов
/ 20 марта 2012

Я немного боролся с тем, как получить вращение, управляемое касанием, тем более, потому что я хочу на 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, а не наоборот.

Наконец-то в касанияхMoved:

- (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] ;
}
0 голосов
/ 24 февраля 2011

Надо думать об этом.Но я предпочитаю вращать вид двумя прикосновениями.Это будет намного проще.

...