用Excel来显示曲面

十月 27th, 2008 by Soloman | Print 用Excel来显示曲面 | 1,179 views

上回说到,我们可以利用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,里面有两个数据文件,分别对应采样数据和插值数据,你可以根据文中的办法尝试生成三维曲面图形。

,

 

本文有24条评论

  1. Yacca 说: [回复]

    excel实在强大…

  2. Soloman 说: [回复]

    @Yacca 呵呵,确实,昨天还看到有个什么数据透视功能,估计也蛮有用的,不过还没去研究过:)

  3. Patrick 说: [回复]

    还能这样用,我只会最基本的用法…

  4. Soloman 说: [回复]

    @Patrick 其实我们手头的软件已经可以做不少事了:)把不停试用新软件的精力分一点来研究老软件怎么用也不错。

  5. basil 说: [回复]

    确实很不错,楼主还研究算法?

  6. Soloman 说: [回复]

    @basil 搞软件的,哪能不研究算法呢?就算半懂不懂也好啊,呵呵。

  7. Soloman 说: [回复]

    @basil 其实插值算法是计算机里很常用的,比如游戏里的素材贴图,Photoshop里改变图片尺寸,这些都是用插值算法实现的。咱们不管它的数学公式是不是明白,至少要明白是干什么用的,怎么用:)个人的一点观点哈:)

  8. Jor 说: [回复]

    确实强大…… 我充其量用得上的就是WPS系列……

  9. Soloman 说: [回复]

    @Jor 其实我以前都不用excel的,不过这次要分析数据了,就用了,其实你发现没?每个操作都非常简单,没有什么复杂的应用:)

  10. Jor 说: [回复]

    excel现在越来越强大了,我倒希望赶快有替代品出来,哈哈。 - -

  11. Shawn 说: [回复]

    对Excel来说,这些应用太强大了。虽然我暂时用不着,但是留着总会有用。

  12. Soloman 说: [回复]

    @Shawn
    这里为了方便大家测试,我把测试数据打包上传:visual_surface_data.rar,里面有两个数据文件,分别对应采样数据和插值数据,你可以根据文中的办法尝试生成三维曲面图形。

  13. JoBru 说: [回复]

    从不知道EXCEL能这么强大~~

  14. leehow 说: [回复]

    正如其形容词excellent 。

  15. Soloman 说: [回复]

    @leehow 啊,原来是这么回事啊,学习了~

  16. i.robot 说: [回复]

    原来是excellent啊…:)

  17. Shawn 说: [回复]

    @Soloman 怎么好几天不见你呢?

  18. Soloman 说: [回复]

    @Shawn 休息了2天哈,呵呵,和人去玩玩啦,唉,吃的肚皮又大两圈~~

添加评论 (支持Gravatar头像)

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。

实时评论预览