2010-11-02 3 views
7

Мне нужно рассчитать угол между линиями. Мне нужно вычислить атан. Поэтому я использую такой кодпомочь вычислить atan2 правильно

static inline CGFloat angleBetweenLinesInRadians2(CGPoint line1Start, CGPoint line1End) 
{ 
    CGFloat dx = 0, dy = 0; 

    dx = line1End.x - line1Start.x; 
    dy = line1End.y - line1Start.y; 
    NSLog(@"\ndx = %f\ndy = %f", dx, dy); 

    CGFloat rads = fabs(atan2(dy, dx)); 

    return rads; 
} 

Но я не могу получить более 180 градусов ((После того, как 179 градусов происходит 178..160..150 и так далее.

мне нужно повернуть на 360 градусов . Как я могу это сделать Что случилось

Maby это помогает:?

//Tells the receiver when one or more fingers associated with an event move within a view or window. 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSArray *Touches = [touches allObjects]; 
    UITouch *first = [Touches objectAtIndex:0]; 

    CGPoint b = [first previousLocationInView:[self imgView]]; //prewious position 
    CGPoint c = [first locationInView:[self imgView]];   //current position 

    CGFloat rad1 = angleBetweenLinesInRadians2(center, b); //first angel 
    CGFloat rad2 = angleBetweenLinesInRadians2(center, c); //second angel 

    CGFloat radAngle = fabs(rad2 - rad1);   //angel between two lines 
    if (tempCount <= gradus) 
    { 
     [imgView setTransform: CGAffineTransformRotate([imgView transform], radAngle)]; 
     tempCount += radAngle; 
    } 

} 

ответ

5

Снимите fabs вызов и просто сделать это:

CGFloat rads = atan2(dy, dx); 
+0

Я пробовал. Не работает – yozhik

+0

@yozhik: Может быть, вы должны ясно, что не работает. Каков ожидаемый результат и что вы видите? – casablanca

+0

У меня есть система координат decart. На котором я предлагаю картину. Есть нуль изображения. Когда я беру и перемещаю свою фотографию в верхних 180 градусах - все сплачивается. Когда я пытаюсь двигаться на 180 градусов, например, 190 - это показывает мне 170 градусов. Мне нужно, чтобы там где 190 градусов. Вы видите ... – yozhik

7

atan2 возвращает результаты в [-180,180] (или -pi, пи в радианах) Для того, чтобы получить результаты от 0,360 использования.:

float radians = atan2(dy, dx); 
if (radians < 0) { 
    radians = TWO_PI + radians; 
} 

Следует отметить, что это характерно для выражения вращения в [-pi, р] и константы выглядит вы можете просто использовать результат atan2, не заботясь о знаке.

+0

не работают, чтобы :( – yozhik

+0

отредактированные мой вопрос, Maby это помогает получить, что случилось. – yozhik

+0

Что Ждут» я работаю? Я предполагаю, что вы заменили правильную константу для 'TWO_PI'. –

0

Используйте эту функцию в Swift. Это гарантирует, что угол от «fromPoint» до «toPoint» составляет от 0 до < 360 (не включая 360). Обратите внимание, что следующая функция предполагает, что CGPointZero находится в верхнем левом углу.

func getAngle(fromPoint: CGPoint, toPoint: CGPoint) -> CGFloat { 
    let dx: CGFloat = fromPoint.x - toPoint.x 
    let dy: CGFloat = fromPoint.y - toPoint.y 
    let twoPi: CGFloat = 2 * CGFloat(M_PI) 
    let radians: CGFloat = (atan2(dy, -dx) + twoPi) % twoPi 
    return radians * 360/twoPi 
} 

Для случая, когда начало координат находится в левом нижнем углу

let twoPi = 2 * Float(M_PI) 
let radians = (atan2(-dy, -dx) + twoPi) % twoPi 
let angle = radians * 360/twoPi 
Смежные вопросы