在我关于数学图形的博客中,一开始讲曲线的生成算法.然后在最近的章节中介绍了圆环,还介绍了螺旋管以及海螺的生成算法.一类是曲线,一类是环面,为什么不将曲线变成环的图形,毕竟曲线看上去太单薄了,这一节我将介绍如何依照曲线(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. 数学图形(1.35)Kappa curve

    不知道这个曲线和那个运动品牌背靠背有什么关系.阿迪原先的商标是个三叶草,难道背靠背也是由数学图形来的? 以下是维基上的解释. In geometry, the kappa curve or Gutsc ...

  2. 数学图形(1.48)Cranioid curve头颅线

    这是一种形似乎头颅的曲线.这种曲线让我想起读研的时候,搞的医学图像三维可视化.那时的原始数据为脑部CT图像.而三维重建中有一种方式是面绘制,是将每一幅CT的颅骨轮廓提取出来,然后一层层地罗列在一起,生 ...

  3. 数学图形(2.6)Satellit curve

    这曲线有点像鼓,绕在球上两头是开口的. #http://www.mathcurve.com/courbes3d/satellite/satellite.shtml vertices = t = to ...

  4. 数学图形(1.49)Nephroid曲线

    昨天IPhone6在国内发售了,我就顺手发布个关于肾的图形.Nephroid中文意思是肾形的.但是这种曲线它看上去却不像个肾,当你看到它时,你觉得它像什么就是什么吧. The name nephroi ...

  5. 数学图形(1.47)贝塞尔(Bézier)曲线

    贝塞尔曲线又称贝兹曲线或贝济埃曲线,是由法国数学家Pierre Bézier所发现,由此为计算机矢量图形学奠定了基础.它的主要意义在于无论是直线或曲线都能在数学上予以描述. 上一节讲的是高次方程曲线, ...

  6. 数学图形(1.2)Sin曲线

    相关软件参见:数学图形可视化工具,使用自己定义语法的脚本代码生成数学图形.该软件免费开源.QQ交流群: 367752815 Sin曲线 vertices = x = *PI) to (*PI) y = ...

  7. 数学图形(2.19) 利萨茹3D曲线

    在前面的章节数学图形(1.13) 利萨茹曲线中,写的是二维的利萨茹曲线,这一节,将其变为3D图形. #http://www.mathcurve.com/courbes3d/lissajous3d/li ...

  8. 数学图形(1.26)Clairaut曲线

    像瓜子样的曲线 相关软件参见:数学图形可视化工具,使用自己定义语法的脚本代码生成数学图形.该软件免费开源.QQ交流群: 367752815 #http://www.mathcurve.com/cour ...

  9. 数学图形(1.25)cassini曲线

    通过这种曲线可以看到一种由8到0的过度 相关软件参见:数学图形可视化工具,使用自己定义语法的脚本代码生成数学图形.该软件免费开源.QQ交流群: 367752815 #http://www.mathcu ...

随机推荐

  1. 【知了堂学习笔记】java 底层容易忽略的知识点

    1. java中的关键字 提到关键字,最主要的就是不能用关键字作为标识符,值得注意的有以下几点. ①其中goto与const在java中没有定义,但是也是关键字.这个基本用不到,但是应该有个认知. ② ...

  2. Bzoj5294/洛谷P4428 [Bjoi2018]二进制(线段树)

    题面 Bzoj 洛谷 题解 考虑一个什么样的区间满足重组之后可以变成\(3\)的倍数.不妨设\(tot\)为一个区间内\(1\)的个数.如果\(tot\)是个偶数,则这个区间一定是\(3\)的倍数,接 ...

  3. 洛谷——P1023 税收与补贴问题

    P1023 税收与补贴问题 题目背景 每样商品的价格越低,其销量就会相应增大.现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最 ...

  4. Java Jxl

    Java Jxl (转自http://blog.csdn.net/laliocat/article/details/50580020) 1 开发调研1.1 需求描述MS的电子表格(Excel)是Off ...

  5. BZOJ.2339.[HNOI2011]卡农(思路 DP 组合 容斥)

    题目链接 \(Description\) 有\(n\)个数,用其中的某些数构成集合,求构造出\(m\)个互不相同且非空的集合(\(m\)个集合无序),并满足每个数总共出现的次数为偶数的方案数. \(S ...

  6. 20162325 金立清 S2 W11 C20

    20162325 2017-2018-2 <程序设计与数据结构>第11周学习总结 教材关键概念摘要 在哈希方法中,元素保存在哈希表中,其在表中的位置由哈希函数确定. 两个元素或关键字映射到 ...

  7. centos7搭建.netcore运行环境

    开发环境介绍 1.操作系统:Windows Server 2008 R2 Enterprise 2.IDE:VisualStudio2017 3..Net Core 2.0 SDK 本文假设你已经满足 ...

  8. 解决IE11下载文件 文件名乱码问题

    1.Win + R输入gpedit.msc打开组策略编辑器:(不会请看下图) 2.定位到计算机配置→管理模板→windows组件→Internet Explorer→自定义用户代理字符串(有些系统用的 ...

  9. Oracle | 给表和字段添加注释

    comment  on  column  表名.字段名   is  '注释内容'; comment on column OPERATOR_INFO.MAIN_OPER_ID is '归属操作员'; c ...

  10. php-curl小记

    用jQuery: $.ajax({ url:url, type:"POST", data:data, contentType:"application/json; cha ...