我需要计算线之间的角度。我需要计算atan。所以我正在使用这样的代码
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;
}
}
答案 0 :(得分:8)
atan2
以[-180,180](或-pi,以弧度表示的pi)返回结果。要从0,360获得结果,请使用:
float radians = atan2(dy, dx);
if (radians < 0) {
radians += M_PI*2.0f;
}
应该注意的是,通常在[-pi,pi]中表达旋转,因此您可以使用atan2
的结果而不必担心该符号。
答案 1 :(得分:6)
删除fabs
来电,然后点击:
CGFloat rads = atan2(dy, dx);
答案 2 :(得分:0)
在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
答案 3 :(得分:0)
您的问题是atan2的结果在-180到+180度之间。 如果您希望它在0到360之间,则将结果确定为正值,然后取模。例如:
let angle = fmod(atan2(dx,dy) + .pi * 2, .pi * 2)