iOS Math для башни / пушки, которая вращается, чтобы следовать за пальцем - PullRequest
0 голосов
/ 24 марта 2012

Я пытаюсь выяснить математику для поворота UIView, определенная сторона всегда "следует" за пальцем при движении по экрану.

Я почти там, но у меня не было тригонометриилет, и я не могу понять, что именно делать.Вот что у меня есть:

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];

    int dy = cannon.frame.origin.y - touchPoint.y;
    int dx = cannon.frame.origin.x - touchPoint.x;

    cannon.transform = CGAffineTransformMakeRotation(atan2(dy,dx) - 135);
}

Ответы [ 3 ]

1 голос
/ 25 марта 2012

Во-первых, спасибо всем, кто нашел время, чтобы ответить!

Я немного поиграл с ним, и, похоже, единственная проблема заключалась в том, что я использовал int s для dy и dx вместо float s. Я также нашел изящный, быстрый «метод» для преобразования градусов в радианы. Вот последний, рабочий код:

#define DEGREES_TO_RADIANS(angle) (angle / 180.0 * M_PI)

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];

    float dy = cannon.frame.origin.y - touchPoint.y;
    float dx = cannon.frame.origin.x - touchPoint.x;

    cannon.transform = CGAffineTransformMakeRotation(atan2(dy,dx) - DEGREES_TO_RADIANS(90));
}
0 голосов
/ 24 марта 2012

Ваша константа 135, вероятно, неверна, поскольку atan2 и CGAffineTransformMakeRotation работают в радианах, а не в градусах. Радиальный эквивалент 135 градусов равен π · 3/4.

Однако, кроме этого, ваш код выглядит нормально - это должно вызвать постоянное смещение, а не странное поведение, которое вы описываете. Вы уверены, что преобразование не влияет на cannon.frame.origin?

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

Я предполагаю, что начальный курс вашей башни правильный.

Ваша постоянная PI равна 3,14 (углы в радианах)

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];

    int dy = cannon.frame.origin.y - touchPoint.y;
    int dx = cannon.frame.origin.x - touchPoint.x;

    float a = atan(abs(dy)/abs(dx));
    if(dx>0 && dy<0) a += PI/2;
    if(dx<0 && dy<0) a += PI;
    if(dx<0 && dy>0) a += 3*PI/2;

    cannon.transform = CGAffineTransformMakeRotation(a);
}

Я думаю, что это может быть более оптимизировано (нет, если), но я не могу проверить себя в данный момент. Это работает?

...