+ (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)
}
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
}
///两圆交点
+ (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
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
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))