помочь правильно рассчитать атан2
-
28-09-2019 - |
Вопрос
Мне нужно рассчитать угол между линиями. Мне нужно рассчитать атан. Так что я использую такой код
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