其實都是一些中學的數學知識,不過都忘的差不多了,把用到的寫下來,方便以后使用
兩點間距離計算:
//計算兩個點之間的距離 CGFloat distanceBetweenPoints (CGPoint first, CGPoint second) { CGFloat deltaX = second.x - first.x; CGFloat deltaY = second.y - first.y; return sqrt(deltaX*deltaX + deltaY*deltaY ); };
計算兩個點與X軸線的夾角:
/** * 計算角度 * @param edge 線 * @return 角度 */ -(CGFloat)angleForStartPoint:(CGPoint)startPoint EndPoint:(CGPoint)endPoint{ CGPoint Xpoint = CGPointMake(startPoint.x + 100, startPoint.y); CGFloat a = endPoint.x - startPoint.x; CGFloat b = endPoint.y - startPoint.y; CGFloat c = Xpoint.x - startPoint.x; CGFloat d = Xpoint.y - startPoint.y; CGFloat rads = acos(((a*c) + (b*d)) / ((sqrt(a*a + b*b)) * (sqrt(c*c + d*d)))); if (startPoint.y>endPoint.y) { rads = -rads; } return rads; }
對於一個View進行旋轉之后,通過view的frame不能准確找到四個角點位置。方法是將四個角點也進行變換,獲取到對應的點
-(void)click:(UIButton *)btn{
//獲取_view的原點旋轉40°后的點的位置
CGPoint roP = [self rotePoint:40 center: _view.center point: _view.frame.origin scale:1];
CGAffineTransform rotation = CGAffineTransformMakeRotation(90*M_PI/180);
[_view setTransform:rotation];
}
/**
* 旋轉后點的計算
*
* @param angle 旋轉角度
* @param center 旋轉中心點
* @param initialPoint 旋轉前點的位置
* @param scale 旋轉變形比例
*
* @return 旋轉后點的位置
*/
- (CGPoint)rotePoint:(CGFloat)angle center:(CGPoint)center point:(CGPoint)initialPoint scale:(CGFloat)scale {
CGFloat x = [self angleForStartPoint:center EndPoint:initialPoint];
x = -x;
if (x > 0) {
x = M_PI-x;
}else{
x = - M_PI - x;
}
CGFloat length = distanceBetweenPoints(center, initialPoint) * scale;
CGFloat ang = x + angle / 180.0 * M_PI;
NSLog(@"ang = %f",ang * 180/M_PI);
CGPoint rotatedPoint;
rotatedPoint.x = center.x - length * cos(ang);
rotatedPoint.y = center.y - length * sin(ang);
return rotatedPoint;
}
注意:獲取旋轉點位置的方法調用需要在view調用transForm方法之前,否則得到的點就是二次變形之后的點了,當時還以為是方法有問題,后來發現是代碼調用位置不對
