iOS CGGeometry

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

结构体

#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;
};

全局常量

#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);

获取几何参数

#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)

判断几何

#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:只对矩形进行平移,不会改变其大小

计算过程(伪代码)

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:

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:

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分割方式

typedef CF_ENUM(uint32_t, CGRectEdge) {
  //从x的最小处进行垂直分割
  CGRectMinXEdge, 
  //从y的最小处进行水平分割
  CGRectMinYEdge, 
  //从x最大处进行垂直分割
  CGRectMaxXEdge,
  //从y最大处进行水平分割
  CGRectMaxYEdge
};

计算过程(伪代码)

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;
}

示例

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进行深入的了解时,只会用到平时常用的几个方法,可是深入了解后还是会发现有很多实用而自己却一直不知道的方法。

你可能感兴趣的:(iOS CGGeometry)