数学图形之将曲线(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 ...
随机推荐
- mysql的第一个程序
每次写java链接数据怎么写,这一次做一个总结,方便参考. 1.在mysql上下载mysql驱动jar包 2.下载的驱动包 3.程序目录 4.程序 package mysqlTest; import ...
- MIT-6.828-JOS-lab1:C, Assembly, Tools, and Bootstrapping
Lab1:Booting a PC 概述 本文主要介绍lab1,从内容上分为三部分,part1简单介绍了汇编语言,物理内存地址空间,BIOS.part2介绍了BIOS从磁盘0号扇区读取boot loa ...
- CSU - 2061 Z‘s Coffee
Description Z is crazy about coffee. One day he bought three cups of coffee. The first cup has a cap ...
- CSU - 2055 Wells‘s Lottery
Description As is known to all, Wells is impoverished. When God heard that, God decide to help the p ...
- MCI:移动持续集成在大众点评的实践
一.背景 美团是全球最大的互联网+生活服务平台,为3.2亿活跃用户和500多万的优质商户提供一个连接线上与线下的电子商务服务.秉承“帮大家吃得更好,生活更好”的使命,我们的业务覆盖了超过200个品类和 ...
- 【基础知识】.Net基础加强 第二天
第02天 .Net基础加强 1. 封装 1> 属性的封装: 属性封装字段:把变化封装一下,保留用户的使用方式 2> 把方法的多个参数封装成一个对象 3> 将一堆代码封装到一个方法中 ...
- opencv 加载 修改 保存 图像
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; /* 1 加载图像 cv::imre ...
- BZOJ3589动态树
**错误改了一上午. 先做熟练泼粪 k<=5,因此我们可以模拟这个过程,在线段树上把标记建出来然后pushup时候更新就好了. By:大奕哥 #include<bits/stdc++.h& ...
- 转MySQL常见错误分析与解决方法总结
一.Can't connect to MySQL server on 'localhost' (10061)翻译:不能连接到 localhost 上的mysql分析:这说明“localhost”计算机 ...
- vijos p1883
题意: 有些东西就如同月光的魔法一般. Luke是爱着vijos的.他想为自己心爱的东西画些什么. 就画N个圆吧.把它们的圆心都固定在x轴上. 圆与圆.为了爱,两两不能相交.为了爱,它们可以互相贴在一 ...