用Excel来显示曲面
上回说到,我们可以利用Excel程序,导入csv格式的曲线(Curve)数据,并方便地绘制出图形。今天,我又利用Excel,来显示曲面(Surface)。
同样的步骤,我们首先需要输出csv格式的曲面数据。然而曲线的数据很简单:X和Y,而曲面则不同,是3D的,我们必须按如下格式输出曲面数据:
x1 x2 x3 x4 ...
y1 z(1,1) z(2,1) z(3,1) z(4,1) ...
y2 z(1,2) z(2,2) z(3,2) z(4,2) ...
... ... ... ... ... ...
其中,第一行为x的值,第一列为y的值,而(0,0)这个单元则无意义。根据这个需求,我用Python语言构造了一个bilinear插值算法的曲面生成器,然后分别在x和y轴上的(0, 2*PI)范围内等距采样,采样函数为f(x,y)=sin(x)*cos(y)*6。并用以下代码来输出csv格式的结果:
def write_data_file(xValues, yValues, zValues):
fn = 'visual_surface.csv'
fh = open(fn, 'wb')
# write x
for i in range(0, len(xValues)):
fh.write(',%f' % xValues[i])
fh.write('\n')
# write rows
for y in range(0, len(yValues)):
fh.write('%f' % yValues[y])
for x in range(0, len(xValues)):
fh.write(',%f' % zValues[y][x])
fh.write('\n')
fh.close()
输出的内容如下:(为了阅读方便,我调整了一下格式)
, 0.000000, 0.628319, 1.256637, 1.884956, ...
0.000000, 0.000000, 3.526712, 5.706339, 5.706339, ...
0.628319, 0.000000, 2.853170, 4.616525, 4.616525, ...
1.256637, 0.000000, 1.089814, 1.763356, 1.763356, ...
1.884956, 0.000000, -1.089814, -1.763356, -1.763356, ...
2.513274, 0.000000, -2.853170, -4.616525, -4.616525, ...
3.141593, 0.000000, -3.526712, -5.706339, -5.706339, ...
3.769911, 0.000000, -2.853170, -4.616525, -4.616525, ...
4.398230, 0.000000, -1.089814, -1.763356, -1.763356, ...
5.026548, 0.000000, 1.089814, 1.763356, 1.763356, ...
5.654867, 0.000000, 2.853170, 4.616525, 4.616525, ...
6.283185, 0.000000, 3.526712, 5.706339, 5.706339, ...
双击这个csv文件,打开Excel,然后选择全部数据:
进而选择插入-〉其他图形-〉三维曲面图:
一个三维的曲面图形就显示出来了:
我们还可以右击该图表,选择“三维旋转”,来从不同的角度看这个曲面:
下图为x,y坐标上10点采样的f(x,y)=sin(x)*cos(y)*6函数图像:
然后是通过bilinear插值算法输出的100×100的曲面:
可以看出bilinear插值算法在样本比较少的情况下,输出的曲面还是轮廓很明显的。关于更好的插值算法,我觉得smoothing flat plate作为2维插值应该不错,不过还没写好改算法,无法测试:)而1维的smoothing spline interpolation插值算法我倒是试过,比简单的linear插值算法优秀,但计算量也相对大一些。
最后,要指出,excel的三维曲面图并不是真正的数学概念下的曲面,其局限性在于,X和Y坐标没有被当作数值来处理,而是仅仅当作一个标签记号而已,所以,我们在用Excel来绘制数学曲面的时候,务必要保证X和Y轴上的各点距离相等。如果你的各点距离不等,Excel并不知道这个,所以它会绘制出错误的图形。所以在我的这个测试中,我在X和Y轴上总是将2PI的弧度等分。
这里为了方便大家测试,我把测试数据打包上传:visual_surface_data.rar,里面有两个数据文件,分别对应采样数据和插值数据,你可以根据文中的办法尝试生成三维曲面图形。







十月 27th, 2008 at 18:31
excel实在强大…
十月 27th, 2008 at 18:32
@Yacca 呵呵,确实,昨天还看到有个什么数据透视功能,估计也蛮有用的,不过还没去研究过:)
十月 27th, 2008 at 22:06
还能这样用,我只会最基本的用法…
十月 27th, 2008 at 22:10
@Patrick 其实我们手头的软件已经可以做不少事了:)把不停试用新软件的精力分一点来研究老软件怎么用也不错。
十月 27th, 2008 at 22:42
确实很不错,楼主还研究算法?
十月 27th, 2008 at 22:43
@basil 搞软件的,哪能不研究算法呢?就算半懂不懂也好啊,呵呵。
十月 27th, 2008 at 22:45
@basil 其实插值算法是计算机里很常用的,比如游戏里的素材贴图,Photoshop里改变图片尺寸,这些都是用插值算法实现的。咱们不管它的数学公式是不是明白,至少要明白是干什么用的,怎么用:)个人的一点观点哈:)
十月 27th, 2008 at 23:12
@老所
受教了
十月 27th, 2008 at 23:39
老时来受教育了
十月 28th, 2008 at 00:29
确实强大…… 我充其量用得上的就是WPS系列……
十月 28th, 2008 at 00:51
@Jor 其实我以前都不用excel的,不过这次要分析数据了,就用了,其实你发现没?每个操作都非常简单,没有什么复杂的应用:)
十月 28th, 2008 at 00:59
excel现在越来越强大了,我倒希望赶快有替代品出来,哈哈。 - -
十月 28th, 2008 at 13:42
对Excel来说,这些应用太强大了。虽然我暂时用不着,但是留着总会有用。
十月 28th, 2008 at 15:22
@Shawn
这里为了方便大家测试,我把测试数据打包上传:visual_surface_data.rar,里面有两个数据文件,分别对应采样数据和插值数据,你可以根据文中的办法尝试生成三维曲面图形。
十月 28th, 2008 at 20:36
从不知道EXCEL能这么强大~~
十月 28th, 2008 at 22:22
正如其形容词excellent 。
十月 29th, 2008 at 12:32
@leehow 啊,原来是这么回事啊,学习了~
十月 29th, 2008 at 21:56
原来是excellent啊…:)
十月 29th, 2008 at 22:57
@Soloman 怎么好几天不见你呢?
十月 29th, 2008 at 23:02
@Shawn 休息了2天哈,呵呵,和人去玩玩啦,唉,吃的肚皮又大两圈~~
十月 29th, 2008 at 23:05
真滋润!
十月 29th, 2008 at 23:06
爽死了
十二月 10th, 2008 at 10:43
确实受教
十二月 10th, 2008 at 22:37
@powerxsu 有用就好:)