主要计算公式:
直线的一般方程 ? ? ?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;
? ? }
}