点旋转、线斜率、圆的交点

273 阅读2分钟
  • 点的旋转
+ (CGPoint)getRoatePoint:(CGPoint)point centerPoint:(CGPoint)centerPoint roateAngle:(CGFloat)roateAngle {

    **double** angle = roateAngle/180*M_PI;

    

    CGFloat netPointX = point.x - centerPoint.x;

    CGFloat netPointY = point.y - centerPoint.y;

\


    CGFloat roateX = netPointX * cosf(angle) - netPointY * sinf(angle) + centerPoint.x;

    CGFloat roateY = netPointY * cosf(angle) + netPointX * sinf(angle) + centerPoint.y;

    **return** CGPointMake(roateX, roateY);

    

//    return CGPointMake((point.x-centerPoint.x)*cos(angle) - (point.y-centerPoint.y)*sin(angle) + centerPoint.x, (point.x-centerPoint.x)*sin(angle) + (point.y-centerPoint.y)*cos(angle)+centerPoint.y);

}
  • 两点的斜率(方法为C++可以稍作变更就可以)
double SKPointGetAngleWithLastPoint(SKPoint *lastPoint, SKPoint *startPoint) {

    **float** bearing = SK_PI + atan2(startPoint->y - lastPoint->y, startPoint -> x - lastPoint->x);

    **float** angle = bearing/SK_PI * 180;

    **return** angle;

}
  • 两圆交点
///定义园的结构体
Circle {

    CGFloat x;

    CGFloat y;

    CGFloat radius;

};

typedef struct CG_BOXABLE Circle Circle;




CG_INLINE Circle

CircleMake(CGFloat x, CGFloat y,CGFloat radius)

{

    Circle p; p.x = x; p.y = y;p.radius = radius; return p;

}

///两圆交点
+ (NSArray *)doubleCircleIntersect:(EEOCircle)circle1 circle2:(EEOCircle)circle2 {

    // 在一元二次方程中 a*x^2+b*x+c=0

//     c1 = C1;

//      c2 = C2;

    CGFloat x1 = circle1.x;

    CGFloat y1 = circle1.y;

    CGFloat x2 = circle2.x;

    CGFloat y2 = circle2.y;

    CGFloat r1 = circle1.radius;

    CGFloat r2 = circle2.radius;

    

    **double** a, b, c;

    //x的两个根 x_1 , x_2

    //y的两个根 y_1 , y_2

    **double** x_1 = 0, x_2 = 0, y_1 = 0, y_2 = 0;

    

    //判别式的值

    **double** delta = -1;

    

    //如果 y1!=y2

    **if** (y1 != y2) {

        

        //为了方便代入

        **double** A = (x1 * x1 - x2 * x2 + y1 * y1 - y2 * y2 + r2 * r2 - r1 * r1) / (2 * (y1 - y2));

        **double** B = (x1 - x2) / (y1 - y2);

        

        a = 1 + B * B;

        b = -2 * (x1 + (A - y1) * B);

        c = x1 * x1 + (A - y1) * (A - y1) - r1 * r1;

        

        //下面使用判定式 判断是否有解

        delta = b * b - 4 * a * c;

        

        **if** (delta > 0) {

            

            x_1 = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);

            x_2 = (-b - sqrt(b * b - 4 * a * c)) / (2 * a);

            y_1 = A - B * x_1;

            y_2 = A - B * x_2;

        } **else** **if** (delta == 0) {

            x_1 = x_2 = -b / (2 * a);

            y_1 = y_2 = A - B * x_1;

        } **else** {

//            NSLog(@"两个圆不相交");

            **return** **nil**;

        }

    } **else** **if** (x1 != x2) {

        

        //当y1=y2时,x的两个解相等

        x_1 = x_2 = (x1 * x1 - x2 * x2 + r2 * r2 - r1 * r1) / (2 * (x1 - x2));

        

        a = 1;

        b = -2 * y1;

        c = y1 * y1 - r1 * r1 + (x_1 - x1) * (x_1 - x1);

        

        delta = b * b - 4 * a * c;

        

        **if** (delta > 0) {

            y_1 = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);

            y_2 = (-b - sqrt(b * b - 4 * a * c)) / (2 * a);

        } **else** **if** (delta == 0) {

            y_1 = y_2 = -b / (2 * a);

        } **else** {

//            NSLog(@"两个圆不相交");

            **return** **nil**;

        }

    } **else** {

        NSLog(@"无解");

        **return** **nil**;

    }

    CGPoint point1 = CGPointMake(x_1, y_1);

    CGPoint point2 = CGPointMake(x_2, y_2);

    NSArray *tempArray = [[NSArray alloc] initWithObjects:[NSValue valueWithCGPoint:point1],[NSValue valueWithCGPoint:point2],**nil**];

    **return** tempArray;

}
  • 计算三角形内内切圆的圆心(内心)
+(CGPoint)getInscribedPointWithPointA:(CGPoint)pointA pointB:(CGPoint)pointB  pointC:(CGPoint)pointC{

    CGPoint result = CGPointZero;

    CGFloat a = hypot((pointB.x - pointC.x), (pointB.y - pointC.y));

    CGFloat b = hypot((pointA.x - pointC.x), (pointA.y - pointC.y));

    CGFloat c = hypot((pointA.x - pointB.x), (pointA.y - pointB.y));

    CGFloat x = (a * pointA.x + b * pointB.x + c * pointC.x) / (a + b + c);

    CGFloat y = (a * pointA.y + b * pointB.y + c * pointC.y) / (a + b + c);

    result.x = x;

    result.y = y;

    **return** result;

}
  • 绘制椭圆轨迹
///第一种
- (NSMutableArray *)arrayOfPointEllipose:(CGRect)rect {

    NSMutableArray *arrayPoint = [[NSMutableArray alloc] initWithCapacity:720];

    

    CGFloat x = rect.origin.x;

    CGFloat y = rect.origin.y;

    CGFloat a = rect.size.width;

    CGFloat b = rect.size.height;

    CGFloat angle = 0;

    unsigned int divideStepTotal = 720;

    for(int index_i=0; index_i < divideStepTotal+1; index_i++) {

        angle += 0.5;

        CGFloat cx = x + a/2 - a/2 * cos(angle * M_PI/180.0);

        CGFloat cy = y +  b/2 - b/2 * sin(angle * M_PI/180.0);

        [arrayPoint addObject:[NSValue valueWithCGPoint:CGPointMake(cx, cy)]];

    }

    return arrayPoint;

}
/// 第二种
///第一个参数为椭圆外接矩形的左上角,第二个参数为椭圆外接矩形上半部分右下角 第三个参数为上半部还是下半部分
- (NSMutableArray* )arrayOfPointsForEllipse:(CGPoint)topLeft andBottomRight:(CGPoint) bottomRight forUpPortion:(**BOOL**)isUpPortion{
    NSMutableArray* arrayPoints = [NSMutableArray arrayWithCapacity:500];

    CGFloat len_a = (bottomRight.x-topLeft.x)/2;

    CGFloat len_b = (bottomRight.y-topLeft.y)/2;

    CGFloat startX = -1.0;

    unsigned int divideStepTotal = 250;

    for (int index_i=0; index_i < divideStepTotal+1; index_i++) {
    
        CGFloat primitiveX = startX + 2.0*index_i/divideStepTotal;
        CGFloat primitiveY = 0.0;
        if (primitiveX*primitiveX > 1.0) {
            continue;
        }
        primitiveY = sqrtf(1.0-primitiveX*primitiveX);
        CGFloat translatedX = primitiveX * len_a  + (topLeft.x + bottomRight.x)/2;

        CGFloat translatedY =  primitiveY * len_b  + (topLeft.y+ bottomRight.y)/2;

        CGFloat translatedNegY = (-1)* primitiveY * len_b  + (topLeft.y+ bottomRight.y)/2;

        if (isUpPortion) {

            [arrayPoints addObject:[NSValue valueWithCGPoint:CGPointMake(translatedX, translatedNegY)]];

        } else {

            [arrayPoints addObject:[NSValue valueWithCGPoint:CGPointMake(translatedX, translatedY)]];

        }

    }
    return arrayPoints;

}

  • 三个数取极值宏
#define MAXNUM(a,b,c) ((((a>b)?(a):(b))>c)?((a>b)?(a):(b)):(c))

#define MINNUM(a,b,c) ((((a<b)?(a):(b))<c)?((a<b)?(a):(b)):(c))