欢迎光临散文网 会员登陆 & 注册

【技术贴】只需要高中数学就可以学会!如何在MATLAB中给三维的曲线加上三维的箭头

2021-10-12 11:14 作者:请叫我绅士君  | 我要投稿

最近一段时间,因为科研工作的需要画出空间中的流线,up萌生出了一个想法:在画出空间流线的同时,能否在流线上同时添加三维的箭头指示方向呢?大概就像封面图展示的一样:

相同的功能在成熟的商业软件里面好像有了(比如comsol),但是在MATLAB中似乎没有现成的函数,并没有办法同时画出三维曲线并且在上面添加三维的箭头。因为up平时用MATLAB用的比较多,本着“自己动手丰衣足食”的思想,up决定还是自己写一个这个功能好了。

在MATLAB中画出三维的曲线还是比较容易的一件事,但画三维箭头遇到的第一个问题就是用什么样的函数画出三维的箭头,up这里想的解决方法是用surface函数画出一个圆锥,大概就是像下面这个样子(来点光线渲染一下):

感觉好像还缺了个底,再加一个底吧:

这个样子看起来就有点像是一个三维的箭头了

箭头的素材差不多是有那个味了,下一步就是需要把这个箭头移动到曲线上,而且还需要把它旋转到曲线对应的切线方向上,让箭头指向流动方向。这一步有点复杂,up是想出了这么一个方法。

首先要介绍一个MATLAB中的“rotate”函数。通过“rotate”函数,我们可以按照定义旋转轴的原点,旋转轴方向,以及旋转角度的方式,将指定物体按照“右手螺旋定则”的方式旋转指定的角度,如下图所示:

那么对于我们之前画出的圆锥体,如果我们在xy平面上指定出一条旋转轴,圆锥体就可以按照我们指定的旋转轴左右旋转,大概就像是这样(灵魂画手):

而对于空间上任意一条曲线来说,它的任意一条有方向的切线都会在xy平面上留下投影

而对于任意一个平面投影向量,总能找到一条过原点的直线与它垂直;

那么这就能够确定我们的旋转轴了。

但是如”rotate”函数所描述的那样,该函数是通过“右手螺旋定则”来对物体进行旋转的.

这也就是说,旋转轴是必须有方向的向量,只有一个特定的旋转轴向量对应一个特定的旋转角度(两个不同的旋转方向加起来是360嘛)才能将目标物体旋转到指定的方向。

如上图所示,这条过原点的直线又会有两个不同的方向

那么,该采取什么算法才能使得对于任意的切线向量,都能按照同样的流程将圆锥体旋转到特定的位置呢?up想的是这个方法:

既然对于任意一条在xy平面上的切线投影,都会有两个方向的旋转轴,那么就指定逆时针旋转90度的那条向量为旋转轴就好了。

根据高中的数学知识,如果切线投影的向量表示为(x,y),旋转轴的向量就可以表示为(-y,x),那么对应的“rotate”函数的旋转轴就可以写为(-y,x,0),这样我们就制定出了一个固定的方式确定旋转轴。

最后再根据高中的数学知识:

求得任意空间向量与z轴的夹角,再根据且点的坐标,把圆锥从(0,0,0)平移到切点对应的(x,y,z)坐标,就可以把图画出来啦!

最后附加上封面图的所有代码


【技术贴】只需要高中数学就可以学会!如何在MATLAB中给三维的曲线加上三维的箭头的评论 (共 条)

分享到微博请遵守国家法律