彙總 計算幾何

2021-10-08 07:33:21 字數 4276 閱讀 9789

眾所周知在c++中double的精度大概是16位(十進位制),因此對double型別的資料進行多次操作可能會丟失精度。

例如sin(pi/4)*2sqrt(2)都是2

\sqrt

2​,但是sin(pi/4)*2 == sqrt(2)卻返回false

解決方法:

const

double eps =

1e-9

;inline

intdcmp

(double x)

inline

intcmp

(double x,

double y)

反三角函式、對數函式等函式,其定義域不是全體實數。如果遇到不明所以的re問題可以檢查一下這些函式。

類似於printf("%.4f", -0.000001);會輸出-0.0000,可能會導致wa。

點和向量都可以用座標儲存,即

struct point };

typedef point vector;

比較和加減、數乘運算與高中數學相同。

叉積用^符號替代(也可以另外定義函式),此處只取其有向長度。

a ⋅b

=∣a∣

∗∣b∣

∗cos

b>

a·b=|a|*|b|*cosa⋅

b=∣a

∣∗∣b

∣∗co

sb>

a ×b

=∣a∣

∗∣b∣

∗sin

b>

a\times b=|a|*|b|*sina×

b=∣a

∣∗∣b

∣∗si

nb>

//定義在struct內部

bool

operator==(

const point &t)

const

point operator+(

const point &t)

const

point operator-(

const point &t)

const

point operator*(

const

double

&k)double

operator*(

const point &t)

const

double

operator^(

const point &t)

const

double

dis(

)double

dis2()

double

rad(

)

在計算幾何中叉積應用得比較多,它可以用於判斷乙個向量相對於另乙個向量的方向(左邊or右邊)、計算平行四邊形或三角形的面積、計算點到直線的距離等。

//兩向量夾角

double

angle

(vector a, vector b)

//向量旋轉(逆時針 弧度)

vector rotate

(vector a,

double rad)

//逆時針九十度的法向量

vector normal

(vector a)

平面上的直線常用的三種表示方法:

計算幾何中常用的儲存方式是第二種,即儲存乙個點和乙個向量表示直線。

struct line 

point point

(double t)

};

線段則只需儲存兩個端點即可。

點到直線距離(平行四邊形的面積除以底邊長)

double

distoline

(point p, line l)

double

distoseg

(point p, point a, point b)

點在直線上的投影點(利用點積的定義)

point getpro

(point p, line l)

bool

onseg

(point p, point a1, point a2)

兩直線交點,需保證兩直線不相交(方向向量叉積不為0)

point inter

(line l1, line l2)

判斷兩線段相交(兩次跨立實驗)

bool

seginter

(point a1, point a2, point b1, point b2)

return

(dcmp

(c1)

*dcmp

(c2)

<0&&

dcmp

(c3)

*dcmp

(c4)

<0)

;}

多邊形:由在同一平面且不再同一直線上的多條線段首尾順次連線且不相交所組成的圖形叫多邊形

簡單多邊形:簡單多邊形是除相鄰邊外其它邊不相交的多邊形

凸多邊形:過多邊形的任意一邊做一條直線,如果其他各個頂點都在這條直線的同側,則把這個多邊形叫做凸多邊形

多邊形一般使用不定長陣列按照順序儲存所有點。

多邊形的面積(分割成若干三角形求其有向面積之和)

double

aera

(vector

&ps)

判斷點是否在多邊形內(射線法與轉角法,此處使用射線法)

int

contain

(point p, vector

&ps)

return

(wn !=0)

;}

若多邊形是凸多邊形,則只需判斷點是否在所有線段的左邊。

pick定理:皮克定理是指乙個計算點陣中頂點在格點上的多邊形面積公式,該公式可以表示為2s=

2a+b

−2

2s=2a+b−2

2s=2a+

b−2,其中a表示多邊形內部的點數,b表示多邊形邊界上的點數,s表示多邊形的面積。

應用:給你多邊形的頂點,問多邊形內部有多少點a=s

−b2+

1a = s - \frac + 1

a=s−2b

​+1直接儲存圓心座標和半徑即可。

struct circle

point point

(double rad)

};

//凸包,左凸殼(op=0)和右凸殼(op=1)

vector

andrew

(vectorps,

bool op)

ans.

push_back

(ps[i]);

}return ans;

}

//半平面交

vector

hpi(vector

&ls,

int rt =1)

while

(r > l +1&&

(ls[q[l]

].v ^

(p[r -1]

- ls[q[l]

].p)

)*rt <=

0)r--

; p[l]

=inter

(ls[q[l]

], ls[q[r -1]

]);for

(int i =

0; i < r - l; i++

)p[i]

= p[i + l]

; p.

resize

(r - l)

;return p;

}

c DataTable 新增列 彙總計算

datatable tgi new datatable tgi.columns.add 型別 typeof int tgi.columns.add 商品編碼 sku typeof string tgi.columns.add 零售單價 typeof double typeof int 也可以寫成 t...

大學專業小彙總 計算機類專業

計算機類專業涉及的資訊行業現在可謂是 浪潮之巔 的行業,並且這個熱度在之後的很長時間內幾乎都不會褪去。首先,資訊領域的技術人才需求量極大,除了網際網路企業之外,其它的行業也需要進行資訊化,可以說每個領域都需要計算機專業的人才 與此對應的,計算機行業的收入也一直雄踞前三甲。其次,公務員體系對計算機專業...

計算幾何與計算幾何與

博主這裡曾經學過計算幾何 下文簡稱jj 所以沒有證明或者說明某些演算法,不適合初學者食用 用一道例題及黃學長的 來理解 黃學長 include include include include include include include include include include define...