對於IOS點、線、角的計算


其實都是一些中學的數學知識,不過都忘的差不多了,把用到的寫下來,方便以后使用

兩點間距離計算:

//計算兩個點之間的距離
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方法之前,否則得到的點就是二次變形之后的點了,當時還以為是方法有問題,后來發現是代碼調用位置不對


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM