【技術(shù)貼】只需要高中數(shù)學(xué)就可以學(xué)會!如何在MATLAB中給三維的曲線加上三維的箭頭
最近一段時間,因為科研工作的需要畫出空間中的流線,up萌生出了一個想法:在畫出空間流線的同時,能否在流線上同時添加三維的箭頭指示方向呢?大概就像封面圖展示的一樣:

相同的功能在成熟的商業(yè)軟件里面好像有了(比如comsol),但是在MATLAB中似乎沒有現(xiàn)成的函數(shù),并沒有辦法同時畫出三維曲線并且在上面添加三維的箭頭。因為up平時用MATLAB用的比較多,本著“自己動手豐衣足食”的思想,up決定還是自己寫一個這個功能好了。
在MATLAB中畫出三維的曲線還是比較容易的一件事,但畫三維箭頭遇到的第一個問題就是用什么樣的函數(shù)畫出三維的箭頭,up這里想的解決方法是用surface函數(shù)畫出一個圓錐,大概就是像下面這個樣子(來點光線渲染一下):

感覺好像還缺了個底,再加一個底吧:

這個樣子看起來就有點像是一個三維的箭頭了
箭頭的素材差不多是有那個味了,下一步就是需要把這個箭頭移動到曲線上,而且還需要把它旋轉(zhuǎn)到曲線對應(yīng)的切線方向上,讓箭頭指向流動方向。這一步有點復(fù)雜,up是想出了這么一個方法。
首先要介紹一個MATLAB中的“rotate”函數(shù)。通過“rotate”函數(shù),我們可以按照定義旋轉(zhuǎn)軸的原點,旋轉(zhuǎn)軸方向,以及旋轉(zhuǎn)角度的方式,將指定物體按照“右手螺旋定則”的方式旋轉(zhuǎn)指定的角度,如下圖所示:

那么對于我們之前畫出的圓錐體,如果我們在xy平面上指定出一條旋轉(zhuǎn)軸,圓錐體就可以按照我們指定的旋轉(zhuǎn)軸左右旋轉(zhuǎn),大概就像是這樣(靈魂畫手):

而對于空間上任意一條曲線來說,它的任意一條有方向的切線都會在xy平面上留下投影;
而對于任意一個平面投影向量,總能找到一條過原點的直線與它垂直;
那么這就能夠確定我們的旋轉(zhuǎn)軸了。
但是如”rotate”函數(shù)所描述的那樣,該函數(shù)是通過“右手螺旋定則”來對物體進(jìn)行旋轉(zhuǎn)的.
這也就是說,旋轉(zhuǎn)軸是必須有方向的向量,只有一個特定的旋轉(zhuǎn)軸向量對應(yīng)一個特定的旋轉(zhuǎn)角度(兩個不同的旋轉(zhuǎn)方向加起來是360嘛)才能將目標(biāo)物體旋轉(zhuǎn)到指定的方向。
如上圖所示,這條過原點的直線又會有兩個不同的方向。
那么,該采取什么算法才能使得對于任意的切線向量,都能按照同樣的流程將圓錐體旋轉(zhuǎn)到特定的位置呢?up想的是這個方法:

既然對于任意一條在xy平面上的切線投影,都會有兩個方向的旋轉(zhuǎn)軸,那么就指定逆時針旋轉(zhuǎn)90度的那條向量為旋轉(zhuǎn)軸就好了。
根據(jù)高中的數(shù)學(xué)知識,如果切線投影的向量表示為(x,y),旋轉(zhuǎn)軸的向量就可以表示為(-y,x),那么對應(yīng)的“rotate”函數(shù)的旋轉(zhuǎn)軸就可以寫為(-y,x,0),這樣我們就制定出了一個固定的方式確定旋轉(zhuǎn)軸。
最后再根據(jù)高中的數(shù)學(xué)知識:

求得任意空間向量與z軸的夾角,再根據(jù)且點的坐標(biāo),把圓錐從(0,0,0)平移到切點對應(yīng)的(x,y,z)坐標(biāo),就可以把圖畫出來啦!
最后附加上封面圖的所有代碼