数学图形之心形

明天是七夕,中国的情人节,为了应节,这一篇提供几个心形曲面的算法.

说到心形,我想到一个笑话,有个女老师在黑板上画了个心形图案,问学生加:"这是什么?"学生们回答:"屁股."老师气哭了,去找校长理论.校长来了就批评学生:"你们怎么又的把老师给气哭了呢?"然后看到了黑板上的图案继续说道:"你们也太调皮了,怎么还在黑板上画了个屁股呢!"
好笑吧,其实我也有类似的经历,有人曾对我说:"你怎么拿个屁股做博客园的头像呢?"我只好无奈的回答:"这不是屁股,这是心形,而且这个心形是我用程序画出来的."关于我的心形头像生成的算法,请看我之前发的博客:屏保:画线圈LineFlower3D屏保: 线圈WhyDemo: 画线圈LineFlower.

我前几天还发过一篇博客:数学图形(1.4)心形线

关于心形曲面,我查找一些资料,但都是隐式方程的曲面,即给出一个数学方程式,然后说这个方程所表示的图形即是一个心形曲面.对于隐式方程,我以后有机会再详细介绍.我从网上下了一个隐式方程解析的代码.不太好用,运算时间很长,图形的顶点分布有些错乱.如下图所示:

我的软件工具目前只能处理显示方程的曲面.下面将发布我所写的几个心形曲面的算法脚本代码:

(1)heart(圆变)
这是我在球曲面的基础上变换出来的.

vertices = dimension1:80 dimension2:160
a = from 0 to (2*PI) dimension1
b = from (-PI*0.5) to (PI*0.5) dimension2
r = 10.0
c = sqrt(abs(a - PI))*1.5
x = r*cos(b)*sin(a)*c
y = -r*cos(b)*cos(a)*c
z = r*sin(b)*0.75

u = a
v = b*2
y = y - array_min(y)*0.5

(2)尖尖的心形

曲线:

vertices = 1000

r = 10.0
t = from 0 to (2*PI)
p = sin(t)*sqrt(abs(cos(t)))/(sin(t) + 7/5) - 2*sin(t) + 2
x = p*sin(t)
y = p*cos(t)

曲面:

vertices = D1:360 D2:100

r = 10.0

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

p = sin(u)*sqrt(abs(cos(u)))/(sin(u) + 7/5) - 2*sin(u) + 2

x = p*cos(u)
y = p*sin(u) + 1.5

x = x*cos(v)
y = y*cos(v)
z = 0.8*sin(v)

(3)完美的心形
这是我目前生成的最完美的心形

曲线:

vertices = 360
u = from (-PI) to (PI)

w = abs(u)
p = w*sqrt(w/(1 + w))

x = p*sin(u)
y = (p*cos(u) + 1)*0.9

平面:

vertices = D1:360 D2:100
u = from (-PI) to (PI) D1
v = from 1 to 100 D2

w = abs(u)
p = w*sqrt(w/(v + w))

x = p*sin(u)
y = p*cos(u)*0.9

曲面:

vertices = D1:360 D2:64

u = from (-PI) to (PI) D1
v = from (PI/2) to (-PI/2) D2

w = abs(u)
p = w*sqrt(w/(1 + w))
b = 0.5

x = p*sin(u)*cos(v)
y = (p*cos(u) + 0.9)*0.9*cos(v)
z = b*sin(v)


 如果你觉得这个心形还是像屁股,那你与下面的图形比较下,就会发现不像了.

(4)像屁股的心形

#http://xahlee.info/surface/kuen/kuen.html

vertices = D1:100 D2:100

u = from  (-1.4325*PI) to (1.4325*PI) D1
v = from (-10) to (10) D2

w = (cosh[v]^2 + u^2)

x = 2*cosh[v]*(cos[u] + u*sin[u])
z = 2*cosh[v]*(-u*cos[u] + sin[u])
y =  v - (2*sinh[v]*cosh[v])

x = x/w
y = y/w
z = z/w

数学图形之心形

时间: 2024-08-01 11:36:16

数学图形之心形的相关文章

数学图形之花儿

前几天,我曾经发布过关于如何生成花形曲线的文章,参见 数学图形(1.11) 玫瑰线 数学图形(1.27) 花 这一节中,会将二维的花形曲线变成三维的花形曲面,其样子会漂亮很多. 相关软件参见:数学图形可视化工具,使用自己定义语法的脚本代码生成数学图形. (1)玫瑰线 vertices = D1:4000 D2:6 n = 8 u = from 0 to (n*PI) D1 v = from 0 to 1 D2 a = rand_int2(2, 16) r = 10*sin(a*u)*v k =

数学图形之肾形

少年IPhone终于有得买了,你的肾准备好了吗?这一节给大家展示一个由数学公式生成一个肾的形状.上一节讲的是Nephroid曲线,其中提到Nephroid虽然意思是肾形的,但它不像个肾.而有种曲线名为Bean曲线,却可以看成是肾形. The formula of the bean curve can be easily rewritten in Cartesian coordinates as (x2 + y2)2 = x3 + y3 其极坐标方程为: 相关软件参见:数学图形可视化工具,使用自己

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

这是一种形似乎头颅的曲线.这种曲线让我想起读研的时候,搞的医学图像三维可视化.那时的原始数据为脑部CT图像.而三维重建中有一种方式是面绘制,是将每一幅CT的颅骨轮廓提取出来,然后一层层地罗列在一起,生成一个3d的MESH.我的研究口味重吧.这里,我也会将一层层的头颅线转化为3D的MESH,也就是一个天灵盖的图形模型. 头颅线的方程式为: (x2 + y2)2 - 2 y2 (y + x) + a2 (b - 1) x2 + (1 - a2) x2 = 0. 相关软件参见:数学图形可视化工具,使用

数学图形之圆柱面

(1)圆柱面 vertices = dimension1:72 dimension2:72 u = from 0 to (2*PI) dimension1 v = from (-5) to (5) dimension2 r = 5 x = r*cos(u) y = v z = r*sin(u) (2)任意角度圆柱面 vertices = dimension1:72 dimension2:72 u = from (-5) to (5) dimension2 v = from 0 to (2*PI)

数学图形(1.46)高次方程曲线

这一节让大家回忆下高中所学的数学.整式方程未知数次数最高项次数高于2次的方程,称为高次方程.高次方程解法思想是通过适当的方法,把高次方程化为次数较低的方程求解.对于5次及以上的一元高次方程没有通用的代数解法和求根公式(即通过各项系数经过有限次四则运算和乘方和开方运算无法求解),这称为阿贝尔定理.不过这一节中我的目的不是求方程的根,而是绘制出N次函数的曲线. 高次方程一般形式可以写为: x^n+bnx^n-1+-------b1x+b0=0 数学课中我们学过,二次方程的曲线是一个抛物线,三次方程的

数学图形之锥体

这一节将为你展示如何生成锥体面,以及各种与锥体相关的图形,有金字塔,五角星,圆锥,冰淇淋, 正劈锥体等. 相关软件参见:数学图形可视化工具,使用自己定义语法的脚本代码生成数学图形. 我之前写过生成圆锥的C++程序,代码发布在圆锥(Cone)图形的生成算法. (1)圆锥面 vertices = dimension1:72 dimension2:72 u = from 0 to (2*PI) dimension1 v = from (-5) to (5) dimension2 x = v*cos(u

数学图形(2.1)三叶结

终于将二维图形发完了,从这一节开始,步入3D的图形世界. 以下是维基中对三叶结的介绍: 在纽结理论中,三叶结(trefoil knot)是一种最简单的非平凡纽结.可以用反手结连接两个末端而达成.它是唯一一种有3个交叉的纽结.它也可以描述为环面纽结.由于三叶结的结构极为简单,它是研究纽结理论很重要的基本案例,在拓扑学.几何学.物理学.化学领域,有广泛的用途. 三叶结可以由以下的参数方程确定: 三叶结也可以看作环面纽结.对应的参数方程为: 针对如上两种数学公式对应的脚本代码如下: #http://z

数学图形(2.2)N叶结

上一节讲的三叶结,举一反三,由三可到无穷,这一节讲N叶结 再次看下三叶结的公式: x = sin(t) + 2*sin(2*t)y = cos(t) - 2*cos(2*t) 将其改为: x = sin(t) + 2*sin((n-1)*t)y = cos(t) - 2*cos((n-1)*t) 就变成了N叶结了,如此简单. N叶结: vertices = 12000 t = from 0 to (20*PI) n = rand_int2(2, 24) x = sin(t) + 2*sin(n*

数学图形(1.10) 双曲线

双曲线有点麻烦,因为它是两条线,而我的程序逻辑中对于渲染只是处理一条线,所以在图形中会有多余的线出现,这不太漂亮,容我以后解决.而且双曲线上的顶点容易过大,造成无效的浮点数,这也要特殊处理. 双曲线(东西开口) vertices = 12000 t = from 0 to (2*PI) a = rand2(0.1, 10) b = rand2(0.1, 10) x = a*sec(t) y = b*tan(t) x = limit(x, -50, 50) y = limit(y, -50, 50