随笔 - 373  文章 - 1  评论 - 771  阅读 - 137万

数学图形之螺旋曲面

这一节中将提供各种螺旋曲面的生成方法.

相关软件参见:数学图形可视化工具,使用自己定义语法的脚本代码生成数学图形.

我之前写过生成圆环的C++程序,代码发布在螺旋面(Spire)图形的生成算法

 

(1)正螺旋面

      正螺旋面就是让一条直线l的初始位置与x轴重合,然后让直线l一边绕z轴作匀速转动,一边沿z轴方向作匀速运动,则直线在这两种运动的合成下扫出的曲面就是正螺旋面。

      显然正螺旋面可以看做是由直线形成的,即它是一个直纹面。

为什么叫正,难道还有反吗?.看其公式,就是将圆向上拉了拉又多转了几圈.

vertices = D1:32 D2:360

u = from 0 to 3 D1
v = from 0 to (8*PI) D2

x = u*cos(v)
y = v*0.5
z = u*sin(v)

(2)正螺旋面随机(helicoiddroit)

加上随机参数的正螺旋面,并向外拉伸了下.

复制代码
vertices = D1:32 D2:360

u = from 0 to 3 D1
v = from 0 to (8*PI) D2

a = rand2(0.1, 1)
b = rand2(1, 5)

x = (b + u)*cos(v)
y = v*a
z = (b + u)*sin(v)
复制代码

(3)阿基米德螺旋面

看其公式,阿基米德螺旋面就是正螺旋面变化了下高度参数

复制代码
#http://202.113.29.3/nankaisource/graphics/differential%20geometry/t060307.htm
#http://www.bb.ustc.edu.cn/jpkc/xiaoji/wjf/kj/

vertices = D1:100 D2:360

u = from 0 to (2) D1
v = from 0 to (8*PI) D2

x = -u/SQRT2*cos(v)
y = u/SQRT2 + v/PI/2
z = -u/SQRT2*sin(v)
复制代码

(4)sincos螺旋面

复制代码
vertices = D1:720 D2:72
p = from 0 to (8*PI) D1
q = from 0 to (PI) D2

a = 5
h = rand2(0.5, 5)

x = a/2*(cos(p) + cos(q))
y = h*(p + q)/2
z = a/2*(sin(p) + sin(q))

u = p
v = q*3
复制代码

(5)渐开螺旋面

复制代码
#http://202.113.29.3/nankaisource/graphics/differential%20geometry/t060306.htm
#http://www.bb.ustc.edu.cn/jpkc/xiaoji/wjf/kj/

vertices = D1:100 D2:360

u = from 0 to (4*PI) D1
v = from 0 to (8*PI) D2

x = 2*[cos(u+v) + u*sin(u+v)]
y = v
z = 2*[sin(u+v) - u*cos(u+v)]
复制代码

(6)双曲正弦螺旋面

复制代码
vertices = D1:360 D2:72
u = from 0 to (5*PI) D1
v = from 0 to (4*PI) D2

a = 5
h = rand2(5, 20)

x = a*sh(u - v)*cos(u+v)
y = h*(u + v)
z = a*sh(u - v)*sin(u+v)

w = 50
x = limit(x, -w, w)
z = limit(z, -w, w)
复制代码

由于sh函数会出现无穷大的情况,所以做了个范围限制,不过这边界太四方了有点难看,修改下:

复制代码
vertices = D1:360 D2:72
u = from 0 to (5*PI) D1
v = from 0 to (4*PI) D2

a = 5
h = rand2(5, 20)

x = a*sh(u - v)*cos(u+v)
y = h*(u + v)
z = a*sh(u - v)*sin(u+v)

w = sqrt(x*x + z*z)

x = if(w > 50, x*50/w, x)
z = if(w > 50, z*50/w, z)
复制代码

(7)Developable helicoid

复制代码
#http://www.mathcurve.com/surfaces/helicoiddeveloppable/helicoiddeveloppable.shtml

vertices = dimension1:1000 dimension2:72

u = from 0 to (18*PI) dimension1
v = from 0 to (2*PI) dimension2

a = rand2(1, 10)
b = rand2(1, 10)

x = a*(cos(u) - v*sin(u))
z = a*(sin(u) + v*cos(u))
y = b*(u + v)
复制代码

(8)Helicoid_wiki

从维基上找的一种螺旋面:

复制代码
#http://en.wikipedia.org/wiki/Catenoid

vertices = D1:400 D2:100

u = from (0) to (PI*16) D1
v = from (0) to (4) D2

t = rand2(-PI, PI)
s = sin(t)
c = cos(t)

x = c*sinh(v)*sin(u) + s*cosh(v)*cos(u)
z = u*c + v*s
y = -c*sinh(v)*cos(u) + s*cosh(v)*sin(u)
复制代码

(9)helicoidcercle

复制代码
#http://www.mathcurve.com/surfaces/helicoidcercle/helicoidcercle.shtml

vertices = D1:72 D2:1200

u = from 0 to (PI) D1
v = from 0 to (36*PI) D2

a = 1
h = 1/(2*PI)

x = a*cos(u)*cos(v)
z = a*cos(u)*sin(v)
y = b*sin(u) + h*v
复制代码

 

再回到第一个脚本,正螺旋面中它的生成方式是:

"然后让直线l一边绕z轴作匀速转动,一边沿z轴方向作匀速运动"

如果用一条曲线一边绕z轴作匀速转动,一边沿z轴方向作匀速运动,那会生成何种曲面呢?

这样的话,每一种曲线都可以生成一种螺旋面.

这里再提供两个例子:

 (10)幂螺旋面

复制代码
vertices = D1:32 D2:360

u = from 0 to 2 D1
v = from 0 to (8*PI) D2

a = rand2(-2, 2)
w = pow(u, a)

x = u*cos(v)
y = v*0.5 + w
z = u*sin(v)
复制代码

(11)指螺旋面

复制代码
vertices = D1:32 D2:360

u = from 0 to 2 D1
v = from 0 to (8*PI) D2

a = rand2(0, 2)
w = pow(a, u)

x = u*cos(v)
y = v*0.5 + w
z = u*sin(v)
复制代码

 

posted on   叶飞影  阅读(4974)  评论(1编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示