其实都是一些中学的数学知识,不过都忘的差不多了,把用到的写下来,方便以后使用
两点间距离计算:
//计算两个点之间的距离 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方法之前,否则得到的点就是二次变形之后的点了,当时还以为是方法有问题,后来发现是代码调用位置不对