美文网首页
iOS计算过圆心直线与圆的交点

iOS计算过圆心直线与圆的交点

作者: 阑丶夜 | 来源:发表于2018-06-19 17:33 被阅读0次

    主要计算公式:

    直线的一般方程      y = kx + b;

    圆的一般方程        x^2 + y^2 + Dx + Ey + F = 0;

    圆的基本系数关系     r = (根号(D^2 + E^2 - 4F))/2

    一元二次方程求根公式    x = -b (+/-) (根号(b^2 - 4ac)) / 2a

    /**

     计算圆环上取色点,解任意点过圆心的直线与圆的交点取其一

     @param pointOne 任意点

    @param circleCenterPoint 圆心

     */

    - (CGPoint)calculateColorPointWithPoint:(CGPoint)pointOne circleCenterPoint:(CGPoint)circleCenterPoint

    {

        //由于OC坐标系与数学坐标系的差异,y值取反,转成数学坐标系

        CGPointtemp1 = pointOne;

        CGPointtemp2 = circleCenterPoint;

        pointOne =CGPointMake(temp1.x, -temp1.y);

        circleCenterPoint =CGPointMake(temp2.x, -temp2.y);

        //计算过圆心直线斜率和常数b

        lineK= (CGFloat)(pointOne.y- circleCenterPoint.y) / (CGFloat)(pointOne.x- circleCenterPoint.x);

        lineB= circleCenterPoint.y-lineK*circleCenterPoint.x;

        //计算圆的方程常数  其圆心坐标(-D/2, -E/2)  半径公式 r = (根号(D^2 + E^2 - 4F))/2

        CGFloatcircleR = circleCenterPoint.x-4;//圆的半径,取圆环的中间值

        circleD= -2* circleCenterPoint.x;

        circleE= -2* circleCenterPoint.y;

        circleF= (powf(circleD,2) +powf(circleE,2) -4*powf(circleR,2))/4.0;

        //一元二次方程求根公式    x = -b (+/-) (根号(b^2 - 4ac)) / 2a

        CGFloata = (1+powf(lineK,2));

        CGFloat b = (2*lineK*lineB + circleD + circleE*lineK);

        CGFloat c = powf(lineB, 2) + circleE*lineB + circleF;

        //直线与圆的两个交点

        CGFloatx1 = ((-b) +sqrtf(powf(b,2) -4*a*c)) / (2*a);

        CGFloaty1 =lineK*x1 +lineB;

        CGFloatx2 = ((-b) -sqrtf(powf(b,2) -4*a*c)) / (2*a);

        CGFloaty2 =lineK*x2 +lineB;

        //当过圆心直线斜率不存在时

        if(pointOne.x== circleCenterPoint.x) {

            x1 = circleCenterPoint.x;

            y1 = -4;

            x2 = circleCenterPoint.x;

            y2 = -(2*circleR +4);

        }

        //两个交点点到触发点的距离

        CGFloatdistance1 =sqrtf(powf(x1 - pointOne.x,2) +powf(y1 - pointOne.y,2));

        CGFloatdistance2 =sqrtf(powf(x2 - pointOne.x,2) +powf(y2 - pointOne.y,2));

        //选择距离近的, 由于OC坐标系与数学坐标系的差异,y值取反转成OC坐标系

        CGPointintersectPoint1 =CGPointMake(x1, -y1);

        CGPointintersectPoint2 =CGPointMake(x2, -y2);

        if(distance1 < distance2) {

            returnintersectPoint1;

        }

        else{

            returnintersectPoint2;

        }

    }

    相关文章

      网友评论

          本文标题:iOS计算过圆心直线与圆的交点

          本文链接:https://www.haomeiwen.com/subject/cafzeftx.html