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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,423评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,339评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,241评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,503评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,824评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,262评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,615评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,337评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,989评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,300评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,829评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,193评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,753评论 3 230
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,970评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,708评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,295评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,207评论 2 258

推荐阅读更多精彩内容