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

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2037 思路 想要看的节目尽可能的多,则首先要将节目按照结束时间从早到晚排序,因为一个节目越早结束,留给 ...

  2. 谷歌pagerank算法简介

    在这篇博客中我们讨论一下谷歌pagerank算法.这是参考的原博客连接:http://blog.jobbole.com/71431/ PageRank的Page可是认为是网页,表示网页排名,也可以认为 ...

  3. keystone 认证深度研究分析

    一.Keystone Token深度概述 Keystone作为OpenStack项目基础认证模块,目前支持的token类型分别是uuid.pkiz.pki.fernet. 首先,简要叙述一下这四种类型 ...

  4. CORS跨域请求[简单请求与复杂请求]

    CORS即Cross Origin Resource Sharing(跨来源资源共享),通俗说就是我们所熟知的跨域请求.众所周知,在以前,跨域可以采用代理.JSONP等方式,而在Modern浏览器面前 ...

  5. Atcoder681 Typical DP Contest E.数 数位dp

    写什么递归....非递归多好写 令$f[i][j]$表示前$i$位的和在模$d$意义下为$j$的方案数,然后转移即可 复杂度$O(10000 * 100 * 10)$ 注意非递归建议高位摆第$n$位. ...

  6. 20162318 2018-2019-2《网络对抗技术》Exp1 PC平台逆向破解

    一.实验目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getS ...

  7. bzoj 4033

    树形DP,dp[i][j]表示i子树中,选了j个白点,i子树中所有边的贡献. /************************************************************ ...

  8. TSQL update 简单应用小总结

    UPDATE 有两种基本的格式.一种是用静态数据来修改表,另一种是用其他表中的数据来修改表.下面是第一种格式: UPDATE #famousjaycees SET jc = 'Jhony cash', ...

  9. Codeforces Round #353 (Div. 2) E. Trains and Statistic dp 贪心

    E. Trains and Statistic 题目连接: http://www.codeforces.com/contest/675/problem/E Description Vasya comm ...

  10. Codeforces Round #280 (Div. 2) E. Vanya and Field 思维题

    E. Vanya and Field time limit per test 2 seconds memory limit per test 256 megabytes input standard ...