计算几何学习小记
文章目錄
- 前言
- 正題
- 平面運算
- 加減
- 乘積
- 常見問題
- 直線/線段規范交點
- 求垂線/點問題
- 判斷點在多邊形的內/外
- 求兩個圓的交點
前言
因為懶得畫圖理解計算幾何所以要來這里鼓勵一下自己
以后新學的應該也會寫在這里。就當我是水博客
應該都是二維的計算幾何,三維的有生之年再學
公式用的不規范,感性理解的
正題
平面運算
定義兩個向量a?=(xa,ya),b?=(xb,yb)\vec{a}=(x_a,y_a),\vec{b}=(x_b,y_b)a=(xa?,ya?),b=(xb?,yb?)
下方為了方便不一定會加→\rightarrow→
加減
向量加法遵循平行四邊形定則,a?+b?=c?\vec a+\vec b=\vec ca+b=c
滿足xc=xa+xb,yc=ya+ybx_c=x_a+x_b,y_c=y_a+y_bxc?=xa?+xb?,yc?=ya?+yb?
向量減法遵循三角形定則,a??b?=c?\vec a-\vec b=\vec ca?b=c
滿足xc=xa?xb,yc=ya?ybx_c=x_a-x_b,y_c=y_a-y_bxc?=xa??xb?,yc?=ya??yb?
圖里a?b?\vec{a-b}a?b?的方向反了/kk
乘積
定義∣a∣|a|∣a∣表示aaa的模長,表示向量aaa的無向長度,而aaa的模定義為有向長度
定義a?ba*ba?b表示aaa與bbb的點積,是bbb投影到aaa上的向量模乘上向量aaa的模。實數a?b=xaxb+yayba*b=x_ax_b+y_ay_ba?b=xa?xb?+ya?yb?
(為了清楚我將紅色線下移了一格),點積就是紅色的長度乘上藍色的長度
一般的時候點積用于判斷兩條直線的正反,如果兩條直線方向相同則點積為正否則為負。
定義a×ba\times ba×b表示aaa與bbb的叉積,是向量a,ba,ba,b圍成的平行四邊形的有向面積。實數a×b=xayb?xbyaa\times b=x_ay_b-x_by_aa×b=xa?yb??xb?ya?
如圖所示的平行四邊形的有向面積就是a×ba\times ba×b
一般用于求多邊形的面積或者判斷一條直線在另一條直線的左側還是右側。
常見問題
直線/線段規范交點
詢問兩條直線a:(sa,ta)a:(s_a,t_a)a:(sa?,ta?)與b:(sb,tb)b:(s_b,t_b)b:(sb?,tb?)交點時(我們用向量形式表示點坐標,再以直線上兩個點表示直線)。
考慮使用面積法
如圖,我們使用叉積計算由直線aaa分開的兩個三角形的面積S1,S2S1,S2S1,S2
那么SO:OT=S1:S2SO:OT=S1:S2SO:OT=S1:S2然后我們又知道STSTST的線段信息就可以求出點坐標OOO的位置。
如果詢問的是線段與直線的,我們加上一個叉積判斷線段是否在直線的兩端即可。
如果詢問線段與線段的,我們就直接分別把兩條線視為直線/線段進行上面的判斷即可。
求垂線/點問題
給出直線lll和直線外一點PPP求它與直線lll的垂點/線
考慮點積
因為SP??ST?=SO?ST\vec{SP}*\vec{ST}=SO*STSP?ST=SO?ST然后除以ST2ST^2ST2我們就可以得到SO:STSO:STSO:ST然后縮短STSTST一定距離就可以得到OOO點了。
當然如果只是求垂線長度的話直接用面積法也行。
判斷點在多邊形的內/外
第一種方法就是射線法,該點隨機向一個方向射線,如果與奇數條邊相交則在內,否則在外。當然這種可能會遇到的包括但不限于以下神奇情況
當然聽大佬說遇到這種情況重新換個方向拉射線就好了(?
特點是運算快,精度高但是特殊情況較多
第二種方法是轉角法,該點開始的射線依次轉過多邊形的每個頂點,如果轉回來之后經過了一個圈,那么就在多邊形內,否則不在
特點是比較通用
求兩個圓的交點
根據余弦定理我們有CB2=AC2+AB2?2AC?AB?cos∠CABCB^2=AC^2+AB^2-2AC*AB*cos\angle CABCB2=AC2+AB2?2AC?AB?cos∠CAB
解出cos∠CABcos\angle CABcos∠CAB然后用atan2atan2atan2函數算出級角再算出方位角即可
待更新懶得更新了,計算幾何爬出OI
總結
- 上一篇: 论坛怎么设置(论坛怎么设置仅作者可见)
- 下一篇: P3265-[JLOI2015]装备购买