iOS CGGeometry

CGGeometry是用C語言實(shí)現(xiàn)的一個(gè)封裝了許多常用幾何方法的文件

結(jié)構(gòu)體

#pragma mark - 結(jié)構(gòu)體

/* 定義一個(gè)點(diǎn),設(shè)置x坐標(biāo)和y坐標(biāo) */
struct
CGPoint {
    CGFloat x;
    CGFloat y;
};

/* 定義一個(gè)尺寸,設(shè)置寬度和高度 */
struct CGSize {
    CGFloat width;
    CGFloat height;
};

/* 定義一個(gè)二維矢量 */
struct CGVector {
    CGFloat dx;
    CGFloat dy;
};

/* 定義一個(gè)矩形*/
struct CGRect {
    CGPoint origin;
    CGSize size;
};

全局常量

#pragma mark - 全局常量

/*零點(diǎn),與CGPointMake(0, 0)等效 */ 
const CGPoint CGPointZero

/*零尺寸,與CGSizeMake(0, 0)等效*/ 
 const CGSize CGSizeZero

/*零矩形,與CGRectMake(0, 0, 0, 0)等效*/ 
 const CGRect CGRectZero

/*空矩形,這個(gè)和零矩形并不相同,當(dāng)我們返回兩個(gè)不相交矩形的交集時(shí),會(huì)返回空矩形 */
 const CGRect CGRectNull

/* 無限的矩形 */
const CGRect CGRectInfinite

#pragma mark - 創(chuàng)建幾何

/* 根據(jù)`(x, y)`創(chuàng)建一個(gè)點(diǎn) */
 CGPoint CGPointMake(CGFloat x, CGFloat y);

/* 根據(jù) `(width, height)'創(chuàng)建一個(gè)尺寸*/
CGSize CGSizeMake(CGFloat width, CGFloat height);

/* 根據(jù) `(dx, dy)'創(chuàng)建一個(gè)矢量 */
CGVector CGVectorMake(CGFloat dx, CGFloat dy);

/* 根據(jù) `(x, y; width, height)'創(chuàng)建一個(gè)矩形*/
 CGRect CGRectMake(CGFloat x, CGFloat y, CGFloat width,
  CGFloat height);

獲取幾何參數(shù)

#pragma mark - 獲取幾何參數(shù)

/* 根據(jù) `rect'參數(shù),獲得矩形最左邊的x值 */
CGFloat CGRectGetMinX(CGRect rect)

/* 根據(jù) `rect'參數(shù),獲得矩形x軸中心點(diǎn)的值*/
CGFloat CGRectGetMidX(CGRect rect)

/*根據(jù) `rect'參數(shù), 獲取矩形最右端的x值*/
CGFloat CGRectGetMaxX(CGRect rect)

/*根據(jù) `rect'參數(shù), 獲取矩形最頂端的y值*/
CGFloat CGRectGetMinY(CGRect rect)

/* 根據(jù) `rect'參數(shù),獲得矩形y軸中心點(diǎn)的值*/
CGFloat CGRectGetMidY(CGRect rect)

/*根據(jù) `rect'參數(shù), 獲取矩形最底端的y值*/
CGFloat CGRectGetMaxY(CGRect rect)

/*根據(jù) `rect'參數(shù), 獲取矩形寬度*/
CGFloat CGRectGetWidth(CGRect rect)

/*根據(jù) `rect'參數(shù), 獲取矩形高度*/
CGFloat CGRectGetHeight(CGRect rect)

/*根據(jù)一個(gè)矩形創(chuàng)建一個(gè)標(biāo)準(zhǔn)的矩形*/
 CGRect CGRectStandardize(CGRect rect)

/* 創(chuàng)建一個(gè)內(nèi)嵌的矩形,中心和rect參數(shù)的中心一樣,將 rect 的坐標(biāo)(origin)按照(dx,dy) 進(jìn)行平移,然后將 rect 的大小(size) 寬度縮小2倍的 dx,高度縮小2倍的 dy. */
CGRect CGRectInset(CGRect rect, CGFloat dx, CGFloat dy)

/* 根據(jù)`rect' 參數(shù),返回四個(gè)參數(shù)都是整數(shù)的矩形 */
CGRect CGRectIntegral(CGRect rect)

/* 返回 `r1' 和 `r2'并集*/
CGRect CGRectUnion(CGRect r1, CGRect r2)

/* 返回 `r1' 和 `r2'交集,如果沒有交集返回CGRectNull */
CGRect CGRectIntersection(CGRect r1, CGRect r2)

/* 返回一個(gè)矩形,偏移量相對(duì)于rect,根據(jù)進(jìn)行平移 */
CGRect CGRectOffset(CGRect rect, CGFloat dx, CGFloat dy)

/**
 將一個(gè) CGRect 切割成兩個(gè) CGRect
 @param rect 原矩形
 @param slice 切割的 CGRect 的指針
 @param remainder 切割后剩下的 CGRect 的指針
 @param amount 切割的大小,是edge開始計(jì)算的方向
 @param edge   CGRectMinXEdge(從x的最小處進(jìn)行垂直分割)、  CGRectMinYEdge(從y的最小處進(jìn)行水平分割)、CGRectMaxXEdge(從x最大處進(jìn)行垂直分割)、 CGRectMaxYEdge(從y最大處進(jìn)行水平分割)
 */
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);

/* 判斷點(diǎn)是否在矩形內(nèi)*/
bool CGRectContainsPoint(CGRect rect, CGPoint point)

/* 判斷矩形1是否包含矩形2*/
bool CGRectContainsRect(CGRect rect1, CGRect rect2)

/* 判斷矩形1和矩形2是否相交*/
bool CGRectIntersectsRect(CGRect rect1, CGRect rect2)

CGRectInset 與 CGRectOffset的區(qū)別

概念:

CGRectInset:對(duì)矩形進(jìn)行平移和縮放兩個(gè)操作

CGRectOffset:只對(duì)矩形進(jìn)行平移,不會(huì)改變其大小

計(jì)算過程(偽代碼)

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

用來分割矩形,參數(shù)rect是源矩形,slice和remainder是分割后的兩部分矩形,amount是分割線,edge是分割選項(xiàng)。

edge分割方式

typedef CF_ENUM(uint32_t, CGRectEdge) {
  //從x的最小處進(jìn)行垂直分割
  CGRectMinXEdge, 
  //從y的最小處進(jìn)行水平分割
  CGRectMinYEdge, 
  //從x最大處進(jìn)行垂直分割
  CGRectMaxXEdge,
  //從y最大處進(jìn)行水平分割
  CGRectMaxYEdge
};

計(jì)算過程(偽代碼)

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

總結(jié)

在沒有對(duì)CGGeometry進(jìn)行深入的了解時(shí),只會(huì)用到平時(shí)常用的幾個(gè)方法,可是深入了解后還是會(huì)發(fā)現(xiàn)有很多實(shí)用而自己卻一直不知道的方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容