数学图形之将曲线(curve)转化成曲面管
在我关于数学图形的博客中,一开始讲曲线的生成算法.然后在最近的章节中介绍了圆环,还介绍了螺旋管以及海螺的生成算法.一类是曲线,一类是环面,为什么不将曲线变成环的图形,毕竟曲线看上去太单薄了,这一节我将介绍如何依照曲线(Curve)生成其相应的曲面管.
相关软件参见:数学图形可视化工具,使用自己定义语法的脚本代码生成数学图形.
在圆柱面这一节的最后,我提供了两种算法,以生成朝向任意方向的圆柱面,一种是极坐标原理,另一种是矩阵原理.这一节也是采用这两个原理生成曲面管,因为由曲线生成的曲面管就是若干个有朝向的圆柱面组成.
先看个三维曲线的代码:
圆环面螺线:
#http://xuxzmail.blog.163.com/blog/static/25131916200976114621705/
#Toroidal spiral vertices = t = from to (*PI) r =
n = x = (r+sin(*t))*cos(t)
y = (r+sin(*t))*sin(t)
z = cos(n*t) r = ;
x = x*r
y = y*r
z = z*r

圆环面螺线管(极坐标原理):
#http://xuxzmail.blog.163.com/blog/static/25131916200976114621705/
#Toroidal spiral vertices = D1: D2: u = from to (*PI) D1
v = from to (*PI) D2 r =
n = xq = (r+sin(*v))*cos(v)
yq = (r+sin(*v))*sin(v)
zq = cos(n*v) #由线变管 xd = array_difference(xq, )
yd = array_difference(yq, )
zd = array_difference(zq, ) len = sqrt(xd*xd + yd*yd + zd*zd)
a = xd/len
b = yd/len
c = zd/len radius =0.2 ac = sqrt(a*a + c*c)
angleY = atan2(ac, b)
angleXZ = atan2(a,c) m = cos(u) * radius
n = sin(u) * radius e = sin(angleY)
f = cos(angleY) g = sin(angleXZ)
h = cos(angleXZ) x0 = m
y0 = -n*e
z0 = n*f x1 = x0*h + z0*g
y1 = y0
z1 = -x0*g + z0*h x = x1 + xq
y = y1 + yq
z = z1 + zq

圆环面螺线管(矩阵原理):
#http://xuxzmail.blog.163.com/blog/static/25131916200976114621705/
#Toroidal spiral vertices = D1: D2: u = from to (*PI) D1
v = from to (*PI) D2 r =
n = xq = (r+sin(*v))*cos(v)
yq = (r+sin(*v))*sin(v)
zq = cos(n*v) #由线变管 xd = array_difference(xq, )
yd = array_difference(yq, )
zd = array_difference(zq, ) len = sqrt(xd*xd + yd*yd + zd*zd)
len = max(len, 0.00001)
a = xd/len
b = yd/len
c = zd/len len = sqrt(b*b + c*c)
len = max(len, 0.00001)
m = c/len
n = -b/len i = b*n - c*m
j = - a*n
k = a*m radius = 0.2 x0 = cos(u) * radius
z0 = sin(u) * radius x = x0*i + xq
y = x0*j + z0*m + yq
z = x0*k + z0*n + zq

这是我所写的最复杂的脚本代码了,为了写这种脚本,我不惜将脚本解析器实现对自定义变量的支持.
不过这两种写法都会有点瑕疵,因为在某个情况下拐点时,会出现扭曲,这种瑕疵似乎很难解决.
再举个节的例子:
line_torus_knot(37)
vertices =
t = from to (*PI) p =
q = r = + cos(q/p*t) x = r*sin(t)
y = sin(q/p*t)
z = r*cos(t) r = 0.5 + 0.5*sin(t)
g = 0.5 + 0.5*y
b = 0.5 + 0.5*cos(t)

pipe_torus_knot(37)极坐标原理
vertices = D1: D2: u = from to (*PI) D1
v = from to (*PI) D2 p =
q = r = + cos(q/p*v) xq = r*sin(v)
yq = sin(q/p*v)
zq = r*cos(v) r = 0.5 + 0.5*sin(v)
g = 0.5 + 0.5*yq
b = 0.5 + 0.5*cos(v) #由线变管 xd = array_difference(xq, )
yd = array_difference(yq, )
zd = array_difference(zq, ) len = sqrt(xd*xd + yd*yd + zd*zd)
a = xd/len
b = yd/len
c = zd/len radius = 0.2 ac = sqrt(a*a + c*c)
angleY = atan2(ac, b)
angleXZ = atan2(a,c) m = cos(u) * radius
n = sin(u) * radius e = sin(angleY)
f = cos(angleY) g = sin(angleXZ)
h = cos(angleXZ) x0 = m
y0 = -n*e
z0 = n*f x1 = x0*h + z0*g
y1 = y0
z1 = -x0*g + z0*h x = x1 + xq
y = y1 + yq
z = z1 + zq

pipe_torus_knot(37)矩阵原理
vertices = D1: D2: u = from to (*PI) D1
v = from to (*PI) D2 p =
q = r = + cos(q/p*v) xq = r*sin(v)
yq = sin(q/p*v)
zq = r*cos(v) r = 0.5 + 0.5*sin(v)
g = 0.5 + 0.5*yq
b = 0.5 + 0.5*cos(v) #由线变管 xd = array_difference(xq, )
yd = array_difference(yq, )
zd = array_difference(zq, ) len = sqrt(xd*xd + yd*yd + zd*zd)
px = xd/len
py = yd/len
pz = zd/len len = sqrt(py*py + pz*pz)
len = max(len, 0.00001)
m = pz/len
n = -py/len i = py*n - pz*m
j = - px*n
k = px*m radius = 0.2 x0 = cos(u) * radius
z0 = sin(u) * radius x = x0*i + xq
y = x0*j + z0*m + yq
z = x0*k + z0*n + zq

数学图形之将曲线(curve)转化成曲面管的更多相关文章
- 数学图形(1.35)Kappa curve
不知道这个曲线和那个运动品牌背靠背有什么关系.阿迪原先的商标是个三叶草,难道背靠背也是由数学图形来的? 以下是维基上的解释. In geometry, the kappa curve or Gutsc ...
- 数学图形(1.48)Cranioid curve头颅线
这是一种形似乎头颅的曲线.这种曲线让我想起读研的时候,搞的医学图像三维可视化.那时的原始数据为脑部CT图像.而三维重建中有一种方式是面绘制,是将每一幅CT的颅骨轮廓提取出来,然后一层层地罗列在一起,生 ...
- 数学图形(2.6)Satellit curve
这曲线有点像鼓,绕在球上两头是开口的. #http://www.mathcurve.com/courbes3d/satellite/satellite.shtml vertices = t = to ...
- 数学图形(1.49)Nephroid曲线
昨天IPhone6在国内发售了,我就顺手发布个关于肾的图形.Nephroid中文意思是肾形的.但是这种曲线它看上去却不像个肾,当你看到它时,你觉得它像什么就是什么吧. The name nephroi ...
- 数学图形(1.47)贝塞尔(Bézier)曲线
贝塞尔曲线又称贝兹曲线或贝济埃曲线,是由法国数学家Pierre Bézier所发现,由此为计算机矢量图形学奠定了基础.它的主要意义在于无论是直线或曲线都能在数学上予以描述. 上一节讲的是高次方程曲线, ...
- 数学图形(1.2)Sin曲线
相关软件参见:数学图形可视化工具,使用自己定义语法的脚本代码生成数学图形.该软件免费开源.QQ交流群: 367752815 Sin曲线 vertices = x = *PI) to (*PI) y = ...
- 数学图形(2.19) 利萨茹3D曲线
在前面的章节数学图形(1.13) 利萨茹曲线中,写的是二维的利萨茹曲线,这一节,将其变为3D图形. #http://www.mathcurve.com/courbes3d/lissajous3d/li ...
- 数学图形(1.26)Clairaut曲线
像瓜子样的曲线 相关软件参见:数学图形可视化工具,使用自己定义语法的脚本代码生成数学图形.该软件免费开源.QQ交流群: 367752815 #http://www.mathcurve.com/cour ...
- 数学图形(1.25)cassini曲线
通过这种曲线可以看到一种由8到0的过度 相关软件参见:数学图形可视化工具,使用自己定义语法的脚本代码生成数学图形.该软件免费开源.QQ交流群: 367752815 #http://www.mathcu ...
随机推荐
- Session机制三(表单的重复提交)
1.表单的重复提交的情况 在表单提交到一个servlet,而servlet又通过请求转发的方式响应了一个JSP页面,这个时候地址栏还保留这servlet的那个路径,在响应页面点击刷新. 在响应页面没有 ...
- PHP的exec()函数无返回值排查方法[转]
在安全imagemagic时 需要用到 exec很多服务器上安装失败 exec()执行外部命令失败,但没有任何错误信息. exec执行某命令在命令行下没有问题,但是在PHP中就出错.这个问题99.99 ...
- react-native第一次开发记录
1.安装指定版本 react-native init demo --verbose --version 0.41.0 2.更新依赖包 npm install -g npm-check-updates ...
- rabbitmq学习之路-rabbitmqctl
rabbitmqctl使用 学习rabbitmq,原理之后第一个要掌握的就是rabbitmqctl这个命令的用法了,rabbitmq的管理功能最全的就是rabbitmqctl命令了,当然还有HTTP ...
- Oracle数据库多表查询,子查询,集合运算
记得自己要敲o~~~ select * from bonus; select * from salgrade; from dual; --笛卡尔积:两张表的乘积 select * from emp,d ...
- HDU - 1051 Wooden Sticks 贪心 动态规划
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- [leetcode tree]100. Same Tree
判断输入的两棵树是不是相同 判断当前root值,左子树和右子树是否相同 ####注意最后用的是 is 而不是 ==,因为最后判断p和q是不是None, 应该判断是不是同一个对象 class Solut ...
- JZYZOJ1140 飞船控制站
http://172.20.6.3/Problem_Show.asp?id=1140 p1140 就一道非常普通的二分,但是非常蛋疼的是验证mid left的过程一直错(就是写一个k次循环然后根据可行 ...
- BZOJ.5311.贞鱼(DP 决策单调)
题目链接 很容易写出\(O(n^2k)\)的DP方程.然后显然决策点是单调的,于是维护决策点就可以了.. 这个过程看代码或者别的博客吧我不写了..(其实是忘了) 这样复杂度\(O(nk\log n)\ ...
- hdu 1116 并查集判断欧拉回路通路
判断一些字符串能首尾相连连在一起 并查集求欧拉回路和通路 Sample Input 3 2 acm ibm 3 acm malform mouse 2 ok ok Sample Output The ...