iOS CGGeometry

CGGeometry是用C语言实现的一个封装了许多常用几何方法的文件

结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#pragma mark - 结构体
/* 定义一个点,设置x坐标和y坐标 */
struct
CGPoint {
CGFloat x;
CGFloat y;
};
/* 定义一个尺寸,设置宽度和高度 */
struct CGSize {
CGFloat width;
CGFloat height;
};
/* 定义一个二维矢量 */
struct CGVector {
CGFloat dx;
CGFloat dy;
};
/* 定义一个矩形*/
struct CGRect {
CGPoint origin;
CGSize size;
};

全局常量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#pragma mark - 全局常量
/*零点,与CGPointMake(0, 0)等效 */
const CGPoint CGPointZero
/*零尺寸,与CGSizeMake(0, 0)等效*/
const CGSize CGSizeZero
/*零矩形,与CGRectMake(0, 0, 0, 0)等效*/
const CGRect CGRectZero
/*空矩形,这个和零矩形并不相同,当我们返回两个不相交矩形的交集时,会返回空矩形 */
const CGRect CGRectNull
/* 无限的矩形 */
const CGRect CGRectInfinite
#pragma mark - 创建几何
/* 根据`(x, y)`创建一个点 */
CGPoint CGPointMake(CGFloat x, CGFloat y);
/* 根据 `(width, height)'创建一个尺寸*/
CGSize CGSizeMake(CGFloat width, CGFloat height);
/* 根据 `(dx, dy)'创建一个矢量 */
CGVector CGVectorMake(CGFloat dx, CGFloat dy);
/* 根据 `(x, y; width, height)'创建一个矩形*/
CGRect CGRectMake(CGFloat x, CGFloat y, CGFloat width,
CGFloat height);

获取几何参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#pragma mark - 获取几何参数
/* 根据 `rect'参数,获得矩形最左边的x值 */
CGFloat CGRectGetMinX(CGRect rect)
/* 根据 `rect'参数,获得矩形x轴中心点的值*/
CGFloat CGRectGetMidX(CGRect rect)
/*根据 `rect'参数, 获取矩形最右端的x值*/
CGFloat CGRectGetMaxX(CGRect rect)
/*根据 `rect'参数, 获取矩形最顶端的y值*/
CGFloat CGRectGetMinY(CGRect rect)
/* 根据 `rect'参数,获得矩形y轴中心点的值*/
CGFloat CGRectGetMidY(CGRect rect)
/*根据 `rect'参数, 获取矩形最底端的y值*/
CGFloat CGRectGetMaxY(CGRect rect)
/*根据 `rect'参数, 获取矩形宽度*/
CGFloat CGRectGetWidth(CGRect rect)
/*根据 `rect'参数, 获取矩形高度*/
CGFloat CGRectGetHeight(CGRect rect)
/*根据一个矩形创建一个标准的矩形*/
CGRect CGRectStandardize(CGRect rect)
/* 创建一个内嵌的矩形,中心和rect参数的中心一样,将 rect 的坐标(origin)按照(dx,dy) 进行平移,然后将 rect 的大小(size) 宽度缩小2倍的 dx,高度缩小2倍的 dy. */
CGRect CGRectInset(CGRect rect, CGFloat dx, CGFloat dy)
/* 根据`rect' 参数,返回四个参数都是整数的矩形 */
CGRect CGRectIntegral(CGRect rect)
/* 返回 `r1' 和 `r2'并集*/
CGRect CGRectUnion(CGRect r1, CGRect r2)
/* 返回 `r1' 和 `r2'交集,如果没有交集返回CGRectNull */
CGRect CGRectIntersection(CGRect r1, CGRect r2)
/* 返回一个矩形,偏移量相对于rect,根据进行平移 */
CGRect CGRectOffset(CGRect rect, CGFloat dx, CGFloat dy)
/**
将一个 CGRect 切割成两个 CGRect
@param rect 原矩形
@param slice 切割的 CGRect 的指针
@param remainder 切割后剩下的 CGRect 的指针
@param amount 切割的大小,是edge开始计算的方向
@param edge CGRectMinXEdge(从x的最小处进行垂直分割)、 CGRectMinYEdge(从y的最小处进行水平分割)、CGRectMaxXEdge(从x最大处进行垂直分割)、 CGRectMaxYEdge(从y最大处进行水平分割)
*/
void CGRectDivide(CGRect rect, CGRect * slice,
CGRect * remainder, CGFloat amount, CGRectEdge edge)

判断几何

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#pragma mark - 判断几何
/* 如果 `point1' 和`point2' 相等返回YES, 否则返回NO*/
bool CGPointEqualToPoint(CGPoint point1, CGPoint point2)
/* 如果`size1' 和 `size2' 相等返回YES, 否则返回NO */
bool CGSizeEqualToSize(CGSize size1, CGSize size2)
/* 如果`rect1' 和 `rect2' 相等返回YES, 否则返回NO */
bool CGRectEqualToRect(CGRect rect1, CGRect rect2)
/* 如果`rect'为空返回YES, 否则返回NO */
bool CGRectIsEmpty(CGRect rect);
/* 如果 `rect' 为null返回YES, 否则返回NO */
bool CGRectIsNull(CGRect rect)
/* 如果 `rect' 是无限矩形返回YES, 否则返回NO */
bool CGRectIsInfinite(CGRect rect);
/* 判断点是否在矩形内*/
bool CGRectContainsPoint(CGRect rect, CGPoint point)
/* 判断矩形1是否包含矩形2*/
bool CGRectContainsRect(CGRect rect1, CGRect rect2)
/* 判断矩形1和矩形2是否相交*/
bool CGRectIntersectsRect(CGRect rect1, CGRect rect2)

CGRectInset 与 CGRectOffset的区别

概念:

CGRectInset:对矩形进行平移和缩放两个操作

CGRectOffset:只对矩形进行平移,不会改变其大小

计算过程(伪代码)

1
2
3
4
5
6
7
8
9
CGRectInset
CGRect rect = CGRectMake(x, y, width, height);
CGRect rectInset = CGRectInset(rect, dx, dy);
rectInset = CGRectMake(dx, dy, (width - ( dx * 2)), (height - ( dy * 2)) );
CGRectOffset:
CGRect rect = CGRectMake(x, y, width, height);
CGRect rectOffset = CGRectOffset(rect, dx, dy);
rectOffset = CGRectMake((x + dx), (y + dy), width, height );

示例

CGRectInset:

1
2
3
4
5
6
7
CGRect rect = CGRectMake(0, 0, 30, 30);
CGRect rectInset = CGRectInset(rect, 10, 10);
CGRect bigRectInset = CGRectInset(rect, -10, -10);
NSLog(@"rectInset:%@ \n bigRectInset:%@", NSStringFromCGRect(rectInset), NSStringFromCGRect(bigRectInset));
// rectInset:{{10, 10}, {10, 10}}
// bigRectInset:{{-10, -10}, {50, 50}}

CGRectOffset:

1
2
3
4
5
6
7
CGRect rect = CGRectMake(10, 10, 30, 30);
CGRect rectOffset = CGRectOffset(rect, 10, 10);
CGRect leftRectOffset = CGRectOffset(rect, -10, -10);
NSLog(@"rectOffset:%@ \n leftRectOffset:%@", NSStringFromCGRect(rectOffset), NSStringFromCGRect(leftRectOffset));
// rectOffset:{{20, 20}, {30, 30}}
// leftRectOffset:{{0, 0}, {30, 30}}

CGRectDivide

用来分割矩形,参数rect是源矩形,slice和remainder是分割后的两部分矩形,amount是分割线,edge是分割选项。

edge分割方式

1
2
3
4
5
6
7
8
9
10
typedef CF_ENUM(uint32_t, CGRectEdge) {
//从x的最小处进行垂直分割
CGRectMinXEdge,
//从y的最小处进行水平分割
CGRectMinYEdge,
//从x最大处进行垂直分割
CGRectMaxXEdge,
//从y最大处进行水平分割
CGRectMaxYEdge
};

计算过程(伪代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CGRect rect = CGRectMake(x, y, width, height);
CGRectDivide(rect, &slice,
&remainder, amount, edge);
switch (edge) {
case CGRectMinXEdge: {
*slice = CGRectMake(x, y, amount, height);
*remainder = CGRectMake(x + amount, y, width - amount, height);
}
break;
case CGRectMaxXEdge: {
*slice = CGRectMake(width - amount, y, amount, height);
*remainder = CGRectMake(x, y, width - amount, height);
}
break;
case CGRectMinYEdge: {
*slice = CGRectMake(x, y, width, amount);
*remainder = CGRectMake(x, y + amount, width, height - amount);
}
break;
case CGRectMaxYEdge: {
*slice = CGRectMake(width, y - amount, width, amount);
*remainder = CGRectMake(x, y, width, height - amount);
}
break;
}

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CGRect slice;
CGRect remainder;
CGRect rect = CGRectMake(0, 0, 200, 200);
CGRectDivide(rect, &slice, &remainder, 50, CGRectMinXEdge);
NSLog(@"slice:%@ \n remainder:%@", NSStringFromCGRect(slice), NSStringFromCGRect(remainder));
// CGRectMinXEdge
// slice:{{0, 0}, {50, 200}}
// remainder:{{50, 0}, {150, 200}}
// CGRectMaxXEdge
// slice:{{150, 0}, {50, 200}}
// remainder:{{0, 0}, {150, 200}}
// CGRectMinYEdge
// slice:{{0, 0}, {200, 50}}
// remainder:{{0, 50}, {200, 150}}
// CGRectMaxYEdge
// slice:{{0, 150}, {200, 50}}
// remainder:{{0, 0}, {200, 150}}

总结

在没有对CGGeometry进行深入的了解时,只会用到平时常用的几个方法,可是深入了解后还是会发现有很多实用而自己却一直不知道的方法。