h = ParametricPlot3D[
RotationTransform[a, {0, 0, 1}][{6, 0, 0} +
RotationTransform[80 a, {0, 1, 0}][{0, 0, 1}]], {a, 0, 2 Pi},
PlotPoints -> 50, Evaluated -> True, Boxed -> False,
Axes -> False,
PlotStyle ->
Directive[Orange, Opacity[1], Specularity[White, 50]],
ImageSize -> 900, PlotRangePadding -> {-0.02, -0.02}] /.
Line[pts_, rest___] :> Tube[pts, 0.095, rest];
Export["solenoid.png", h]
任意无限连续可微的空间曲线上,如果在其外套上一个螺线管,则如何求螺线管的曲线参数方程?
这个情形属于最简单的之一,比直线螺线管当然复杂些。
思路是取x-z坐标平面上一点,做XOZ平面的旋转(加上螺线管中心大圆半径尺度的平移,该平面上旋转的角度只能与中心的空间曲线的弧长成比例,否则螺线管的螺距就不均匀了,所以涉及到空间曲线的弧长的积分;这种在一般平面的旋转其实是以切线T方向为轴的空间旋转而已),然后移动这个点,求它的轨迹。
从而就是一个旋转和平移+旋转的复合而已。
如果考虑任意无限连续可微的空间曲线,能想到的一般的方法只能是Frenet坐标中的主法线(N,normal)和副法线(B,binormal)作为旋转所在的平面,然后沿着切线(T, tangent)的方向移动,通过这种方式获取点的轨迹的空间参数。不过,如果曲线本身复杂,求Frenet坐标也会高难,进而计算坐标变换就不宜; 而且曲线的参数t与旋转的要一致,也可能产生较大的计算量。
这种计算每次都让我想起goodbear和当时的一个很随性的问题http://blog.csdn.net/stereohomology/article/details/4666222.
后来过了很多年,看goodbear的复旦BBS的帐号的昵称:
goodbear (0518|男人没一个好东西) 于 2009年10月12日22:57:45 星期一 提到
这才意识到,goodbear是个女生!
是的,我一向是个愚钝的人。至今没有变得更敏捷。
对于任意可微的空间曲线,也可以建立类似的方程,不过取一些简单的作为例子吧:
近些时间,发现Mathematica的 Export (到GIF)函数,以及 Tube 函数, 都存在各种各样的bug, 非常遗憾. 比如, 把上面的曲线Tube化之后居然意外地有很多接头出现:
改用Graphics3D + Spline方式, 不能彻底改善接头的问题: