1. 程式人生 > 其它 >物聯網無線通訊數傳模組:多主機閘道器工作模式,一文看懂

物聯網無線通訊數傳模組:多主機閘道器工作模式,一文看懂

非常幼稚和不嚴謹的學習筆記。

前置

闆闆

點積

點積比較簡單,即 \(a\cdot b=|a||b|\cos\theta\),計算方式是 \(\text{dot}=x_1x_2+y_1y_2\)。然後常用的是用點積除以其中一個的模長,得到的就是另一個向量到這個向量的投影長度。根據這個投影方向和原向量的方向這玩意有正有負。這玩意顯然是符合交換律的,畢竟 \(\cos\) 的符號圓也是這樣的嘛。然後根據 \(\cos\) 的符號性質可以通過點積來判斷 \(\theta\)\(90^\circ\) 的關係,如果正的話就小於,否則大於,剛好是 \(90^\circ\) 就剛好是 \(0\)

叉積

然後是叉積。\(a\times b=|a||b|\sin\theta\)

,計算方式是 \(\text{dog}=x_1y_2-y_1x_2\)。數值上等於從 \(a\)\(b\) 形成的平行四邊形的面積,由於有方向(也可以參照 \(\sin\) 的符號圓),得出來的數值的符號取決於兩個向量的相對位置,如果 \(a\)\(b\) 是逆時針更近那麼就是正的,否則就是負的。當然如果叉積是 \(0\) 的話說明兩個向量是平行的。

旋轉

\((x,y)\) 繞著原點旋轉 \(\theta\) 後的點座標應該是 \((x\cdot\cos\theta+y\cdot\sin\theta,-x\cdot\sin\theta+y\cdot\cos\theta)\)

。如果不是以原點為中心的話直接重新建系還原回去即可。

點是否線上段上

可以直接用 \(dis_{x,p}+dis_{p,y}\)\(dis_{x,y}\) 做比較,但是精度可能會損失比較多。另一個方法是直接看 \(\frac{a\cdot b}{|a||b|}\)\(-1\) 的關係,但同樣會損失精度。總之呢就是儘量不要去算線段長度(畢竟 \(\text{sqrt}\) 函式會大大地損失精度)。所以通過判斷共線且外開的方式來判斷,即 \(a\times b=0\) 並且 \(a\cdot b<0\)

點到線段的距離

首先算出來 \(p\) 分別到 \(x\)\(y\) 的距離,然後看兩個底角有沒有鈍角,就是看 \((p,x)\cdot (x,y)\)

\(0\) 的關係。如果有小於 \(0\),也就是有鈍角的話那麼就取前面的那個,否則直接返回三角形的高,即 \(|\frac{(p,x)\times(p,y)}{\text{dis}(x,y)}|\)。然後似乎要特判 \(x,y\) 重合的情況,但是什麼樣的傻逼才會卡這種細節啊喂。

點是否在直線上

和線段上同理,不需要判斷內張還是外張,充要條件就是 \(a\times b=0\)

點到直線的垂足

先求出 \(-a\)\(l\) 上的投影 \(a'\),同理求出 \(b'\),發現垂足到 \(x\) 的距離是 \(l\) 長度的 \(\frac{a'}{a'-b'}\) 倍,計算即可。別忘了計算投影長度的時候要把地面除掉。

點關於直線的對稱點

關於垂足對稱。略過。