iOS中的幾何學 CGGeometry

2021-07-05 04:21:44 字數 4338 閱讀 7995

首先來了解一下ios和os x的繪製系統:

1.cgpoint,是乙個結構體,表示了二維座標系統中的乙個點,ios中原點是左上角,x軸和y軸的值分別是向右和向下增加。os x中原點是左下角,相反地,x軸和y軸的值分別是向右和向上增加。

2.cgsize,也是乙個結構體,表示了包括寬度(width)和高度(height)的尺寸。

3.cgrect,仍然是乙個結構體,包含了cgpoint(代表原點)和cgsize(代表尺寸),表示了乙個長方形,從原點開始按照寬度和長度的尺寸繪製。

因為cgrect代表了出現在螢幕上的每乙個view的frame,所以乙個程式設計師的圖形程式設計能力取決於能否熟練地使用長方形幾何。幸運的是,quartz有很多有用的功能,可以省去我們很多的計算功夫,雖然圖形程式設計在ios中十分重要,但是quartz有很多功能可以說是鮮為人知。

轉換功能

rectbyoffsetting/cgrectoffset:返回乙個相對於原長方形原點偏移了的長方形。

cgrect cgrectoffset(

cgrect rect,

cgfloat dx,

cgfloat dy

)

設想一下每當你要改變乙個長方形的原點就可以使用,不單是省去了很多行**,更重要的是這比改變原點在語言上更加直觀。

rectbyinsetting/cgrectinset:返回乙個相對於原長方形更大或者更小,但是同乙個中心點的長方形。

cgrect cgrectinset(

cgrect rect,

cgfloat dx,

cgfloat dy

)

希望漂亮地在乙個view的基礎上再建立乙個view?用cgrectinset並傳入10的值,那麼就會返回乙個比原長方形左右以及上下都增加了10的長方形。

integerrect/cgrectinteger:返回乙個相對於原長方形所有值取整的長方形。

cgrect cgrectintegral (

cgrect rect

)

值得注意的是,cgrect所有的值都會被四捨五入取最接近的整數,分數值會導致在畫素邊緣繪製。因為畫素是最基本的繪製單位,所以分數值就會導致繪製平均地繪製到下一畫素,由此就會導致模糊。對於原點的值會取小於或等於原值的整數,對於尺寸的值則會去大於或等於原值的整數。所以作為經驗之談,如果有一些可能會導致出現分數值的操作,最好使用此函式取整,重設view的frame。

技術性提醒,由於座標系統通常是用點(point)表示,對於視網膜屏,乙個點有四個畫素,所以在視網膜繪製的時候,可以有0.5的分數值取奇數個畫素,而不會導致模糊。

取值功能

cgrectget[min|mid|max][x|y]

cgrectgetminx

cgrectgetminy

cgrectgetmidx

cgrectgetmidy

cgrectgetmaxx

cgrectgetmaxy

上述六個函式分別對乙個長方形的x值或y值取最小值、中間值、最大值:

cgfloat cgrectget[min|mid|max][x|y] (

cgrect rect

)

這幾個函式以十分簡潔易懂的方式代替了諸如frame.size.x + frame.size.width這樣的**。

cgrectget[width|height]

// returns the height of a rectangle.

cgfloat cgrectgetheight (

cgrect rect

)// returns the width of a rectangle.

cgfloat cgrectgetwidth (

cgrect rect

)

這兩個函式顧名思義,返回長方形的寬或高。

特點cgrectzero,cgrectnull, &cgrectinfinite

這是長方形的值中三個特殊值,每乙個都有自己獨特的屬性:

cgrect.zerorect/const cgrect cgrectzero: 零長方形,乙個長方形常量,原點是(0,0),寬和高也是0。

cgrect.nullrect/const cgrect cgrectnull:null長方形,兩個不連貫的長方形返回的值,不等同於零長方形。

cgrect.infiniterect/const cgrect cgrectinfinite: 擁有無限尺寸大小的長方形。

cgrectzero應該是最有用的特殊值了,初始化子檢視的時候,其frame經常是cgrectzero,frame的設定則延遲到-layoutsubviews.

cgrectnull不同於

cgrectzero,儘管有很多暗示null == 0。這個值其實更接近於nsnotfound,代表了值的預設。需要注意什麼樣的函式可以返回cgrectnull,並正確地操作。

cgrectinfinite可以說是最迷人、最有趣的特殊值。它和所有的點和長方形相交,包含所有的長方形,

關係

從乙個長方形移動到另乙個長方形,兩個長方形可以通過相交或合併來建立新的長方形

cgrectintersection

rectbyintersecting/cgrectintersection: 返回兩個長方形的相交部分。

cgrect cgrectintersection (

cgrect rect1,

cgrect rect2

)

這是找出兩個view重疊部分的乙個快捷方式,如果兩個長方形不相交,則返回null長方形。

cgrectunion

rectbyunion/cgrectunion: 返回乙個包含兩個長方形的長方形。

cgrect cgrectunion (

cgrect rect1,

cgrect rect2

)

返回乙個包含兩個傳入長方形的長方形,很方便地建立乙個長方形包含兩個單獨的view,以上方法還可以組合使用:

cgrect combinedrect = cgrectinset(cgrectunion(imagerect, textrect), -10, -10);

以上就建立了乙個包含imagerect和textrect的長方形,並且上下左右各增加10的值,新建立的長方形不會和包含的長方形重疊。

最後

前方高能預警,前方是最費解、最易誤解、最有用的cggeometry函式:cgrectdivide。

cgrectdivide

cgrectdivide: 將乙個長方形分割成單獨的兩個長方形。

void cgrectdivide(

cgrect rect,

cgrect *slice,

cgrect *remainder,

cgfloat amount,

cgrectedge edge

)

cgrectdivide的操作步驟如下:

1.選取乙個長方形並選定其中一邊(上下左右)

2.度量出距離選取邊的一定距離。

3.選取邊至度量距離之間的值會儲存在slice裡面

4.原長方形的其餘值則儲存在reminder裡面

edge是乙個列舉值cgrectedge:

enum cgrectedge

這個方法十分適合於在view之間分離出可用的空間,通過組合使用可以在多於兩個view之間操作。

計算幾何學 3

點的內包 判斷點是否在多邊形內。輸入 乙個多邊形點的序列 問題數各個問題的點的資訊 輸出 2代表在圈內 1代表在圈上 0代表在圈外 只要檢查一p為端點且平行於x的射線與多邊形g的邊的相交次數,我們就能判斷給定的點p是否內包與多邊形g。對於構成多邊形各邊的線段設如果a和b外積大小為0且內積小於等於0,...

計算幾何學簡單的模板

一些定義 include include include include include using namespace std define maxn 1200 define eps 1e 8 struct point po maxn struct line typedef point vecto...

演算法導論之計算幾何學

所屬專欄 演算法導論專欄 計算幾何學是電腦科學的乙個分支,專門研究集合問題的解決的演算法。計算幾何學的問題一般輸入關於一組集合物件的描述,如一組點 一組線段 輸出是對問題的回答,如直線是否相交。三維空間和高維空間很難視覺化,這裡計算幾何學主要基於二維平面,輸入物件用一組點來表示,其中每個pi xi,...