Вопрос

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

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

}
Это было полезно?

Решение

Удалить fabs Позвоните и просто сделайте это:

CGFloat rads = atan2(dy, dx);

Другие советы

atan2 Возвращает результаты в [-180,180] (или -PI, PI в радианах). Получить результаты от 0,360 Использование:

float radians = atan2(dy, dx);
if (radians < 0) {
    radians += M_PI*2.0f;
}

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

Используйте эту функцию в SWIFT. Это обеспечивает угол из «от точки» на «разветвление» приземляется от 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top