存档在 ‘Excel相关’ 分类中.

革命性的3D引擎——Microsoft Excel

转摘自cnbeta,留存于此,便于查阅和参考。
出色的电脑游戏都会使用不同的图形引擎处理子系统—我们常说的3D引擎.例如Soure引擎(国内译名”起源”引擎,Half Life 2所使用),Unreal引擎(国内译名”虚幻”引擎,虚幻竞技场实用).IdTech4引擎(for:DOOM4),Cry2引擎(for:孤岛危 机),Clever’s Paradox引擎,这些都是在玩家间及游戏业界非常出名的图形引擎.下面您将了解到的是一个全新的3D图形引擎:Microsoft Excel
为我们所熟知的Excel是个全方位的办公工具软件,但它也有不为人所熟知的另一面,那就是它拥有一些功能特性,使得Excel可以作为一个优质的3D绘图引擎被使用。
通过这篇文章,我会展示Excel的算术运算,嵌入式渲染子系统(这里有两个不同的渲染子系统)和革命性的方法,理解这些仅需要你做一个思维观念上的重大转变。我希望你能发现Excel有效地和迅速地整合了实用性等众多的特点,多平台的可移植性,和基于独特且超现实的3D引擎特性为依托的高性能。章节中甚至有演示程序和短片, 这些都是由Excel 3D引擎创建的。
警告:非专家请谨慎尝试!
数学运算:
也许证明Excel的数学运算功能,仅需要有一个示范,至少在所有需要演示中这项是最少的。3D物体的操纵的核心函数(例如:四则运算,三角函数,矩阵代数)是Excel的本质所在—但它们是值得研究的,因为他们无与伦比的布局特点和良好的简约性,目前在整个流行的3D引擎领域,Excel犹如高塔般 耸立。(作者有点夸张,因为网上的演示虽然值得称赞,但远没有到达作者夸耀的地步)
合理的布局
很可能不会有游戏引擎能够解决整个三维算法问题,仅仅在半个屏幕大小的空间上。上半部分图1包含的空间位移,旋转的X ,Y ,Z轴和透视投影等等。这些都可以在演示程序看到,多边形的透视,Z缓冲(是在为物件进行着色时,执行“隐藏面消除”工作的一项技术,所以隐藏物件背后的部分就不会被显示出来。在3D环境中每个像素中会利用一组数据资料来定义像素在显示时的纵深度,即Z轴座标值。Z缓冲所用的位数越高,则代表该显示卡所提供的物件纵深感也越精确。目前的3D加速卡一般都可支持16位的Z Buffer)和反射的计算,所需的屏幕大小近似.
ugmbbc_183445
图1:3D引擎的实质
黄色标记了用户定义的参数,绿色指出的是引擎的计算数值,数字区域包含了如下一些数据(以下基于本人的计算机图形学知识)
1.透视投影的参数。
2.3D物体的坐标相对坐标(相对于物体的中心)
3.矩阵平移变换和旋转变换
(更多信息可以通过如下链接找到http://en.wikipedia.org/wiki/3D_projection)
4.旋转参数
5.在平移变换和旋转变换后,点的3D绝对坐标。
6.透视图影后,点的2维坐标。
7.点的屏幕坐标
8.物体边缘的终点
9.矩阵的平移旋转变换中的重要公式,这里我们可以更简洁和紧凑,看得非常清楚.
简洁性
Excel的开发环境,不仅允许程序员在编写时可以使用无格式的源码或者语法高亮突出的源代码,而且它也提供了其所有众所周知的格式化功能函数给引擎开发 人员:一些字体可以同时使用(不同的大小和类型);单元格和彩色文本;允许添加可弹出的提示;甚至是声音 (例如: “sit down”),也可以在整个电影需要的地方插入。
渲染方式
开发人员可以选择在2个渲染子系统间选择:
1.Excel自身的单元格图形(以下简称ECG)
2. 基于Office套件的图形抽象层(以下简称OGAL)
Excel自身的单元格绘图
启动Excel后,立刻忘记以往的习惯,我们可以看到充斥着单元格的EXCEL表格在屏幕上,以及包含我们所需数据的单元格,文本和公式。在这个屏幕上尝试着认为这个表格就是普通引擎的屏幕,而单元格就是一个个像素。
在此基础上不寻常的办法:
工作表=引擎的可视屏幕
单元格=像素点
毫无疑问,这是一个令人惊叹的模拟近似,接下来的问题就是如何将这些散装矩形形状的单元格可被视为像素?但我们会看到,这些矩形只是展现一个独特的功能的细胞图形,事实上,在适当的时候,和一般的小,老式的方块像素一样,在需要的时刻这些细胞图形的用法与以前并无二致。
抛开你对新事物的反感情绪,并看看ECG特性:
像素是可以调整大小的,因此如果有人想像过去那样.继续使用小的,老式的方块像素来开发,就像在传统的三维引擎中那样,也许能使他/她觉得这样可以开发更容易些(请见图2和3)。
ugmbbc_183548
图2:Excel中的默认像素实例
ugmbbc_183625
图3:调整大小(色调)的像素,趋于传统
应该指出的是,这种革新是该系统的一个有机组成部分,允许所使用的像素,在每行每列的大小不同,可以看出在图4 。
ugmbbc_183632
图4:像素在每行设置不同的大小
这个特殊的大小调整的最好例子,就是Excel的默认设置,在默认设置下常规像素变成了矩形形状,这是很容易让我们混淆,将他们作为数据输入区来看待。
大多数用户甚至不会意识到,这些都是像素,仅仅见他们作为数据区域来看.
ugmbbc_183639
图5:没有网格线的渲染
ugmbbc_183645
图6:带有网格线的渲染
·如果需要,可以使用占据极小像素点大小的网格线。在行和列有不同的大小的情况下,这是一个非常有用的功能。您可以通过图5和图6看到网格线功能.
·象素的颜色可以设置24位存贮模式(即2的24次方种颜色)。
·255×65535屏幕分辨率,所带来的好处是,可以使用近16.7百万像素的分辨率,这在其它3D引擎中是未发现的。
·惊人的1:256的长宽比,使得我们可以设置隐藏/隐藏功能,以获得4:4, 16:9或其他任意比率。
·可以拥有255屏幕在一个工程中,所以不止是一般的2个,将会有更多的画面缓冲器可以一起使用。
·内置在变焦功能,利用函数可以放大或缩小像素。
可以这样说, ECG超越了其时间和包含了很多独特和无可比拟的特点是不容易在其他的三维引擎找到的:可变大小的像素,任意变长宽比, 16.7百万像素的分辨率,可切换的像素大小的网格线。
如图所示(图7),可以看的到这引擎的实际表现(在渲染网格线的情况下) 。您可以开始演示下载我们的例子中的Excel引擎文件(Excel的询问时, 启用宏),迫切的Alt +按F8键和运行ecg_demo 。
ugmbbc_183651
图7:运算中的引擎(ECG渲染子系统)
缺点是ECG的速度不够快和缺乏一些常见的引擎功能(例如,绘制线,材质贴图等) ,必须由开发员自行开发。
基于Office套件的图形抽象层
若是没有对ECG的先进功能的需要,像是可调整大小像素和可变长宽比率,那么 Excel的其他绘制子系统-整体中剥离的图形抽象层—是另一个选择。
OGAL提供的附加功能(多边形绘图,填充等),体现出更高的性能和兼容性与其他应用程序的的MS Office套件。如果需要将3D的应用程序进行移植,此兼容性能是非常有用的.
这是一个奇特的渲染过程,渲染是表现在工作表单之外的一个单独的层,所以子系统可以在不修改现有的内容的工作状态下运行。
此特性使得有可能运行OGAL和ECG并驾齐驱,或显示的背景和他们的计算结果就在同一个屏幕上-这有助于调试过程。截图运行OGAL子系统在下面可以看到(图8)。
在工作表单前面的独渲染层是很便于观察的:虽然旋转立方体的画面是由这一层提供,但3D的计算的部分由引擎负责,可以在背景中看到。
ugmbbc_183702
图8:运行中的引擎(使用的基于OFFICE组件的抽象图像渲染层)
一个典型OGAL子系统表现的例子就是可见的多边形:而借鉴于目前的3D引擎的基本处理对象是三角形,OGAL也支持其他多边形(如四边形,五边形等)。
这里不需要一个单独的背景缓冲区,因为OGAL将会处理好一切。颜色可以设置由24位存贮方式,而子系统为的透明度提供了额外的Alpha通道。示范档案可在我的例子中Excel文件引擎找到-对于如何避免实时时间,在录像中都有演示:
警告:你非常-非常确定你是个专家!否则慎用!
思维的转变
连续性从本质上影响我们在实际编程中的语句表达。它出现在你编程事业的每一个角落:每天数以千计的程序代码,一步步创建可执行文件(就像定义在make程序的描述文件那样),调试运行一条条命令。
数以千计不同的程序和几十亿的源代码行,都是被连续性思维方式所创造。连续性贯穿我们目前的编程模式,使许多程序员不会怀疑其存在的合理性,并被它的局限性所制约,这是理所当然的事。
注意:请不要低估习惯的力量!也许您有一个QWERTY键盘(指我们所用的标准键盘),其实那是一个有意排列使你不舒服的布局!

标签: 没有标签

Microsoft Excel历史一览

好不容易找到的资料,Microsoft Excel历史版本一览,让您领略Excel的足迹。
Microsoft Excel 1.01, Macintosh edition, French
Excel 1.01
Microsoft Excel 1.5, Macintosh edition
Excel 1.5
Microsoft Excel 2.1, promotional edition
Excel 2.1
Microsoft Excel 2.2, OS/2 edition
Excel 2.2
Microsoft Excel 2.2a, Macintosh edition, French
Excel 2.2a
Microsoft Excel 3.0, OS/2 edition
Excel 3.0
Microsoft Excel 4.0, Macintosh edition, German
Excel 4.0
Microsoft Excel 4.0, version 4.0a, part of Office 4.0 package
Excel 4.0a
Microsoft Excel 5.0
Excel 5.0
Excel 5.0a
从6.0开始,Excel放弃以数字作为版本号的方式,开始使用年份定义版本。
Microsoft Excel 95
Excel 95
Microsoft Excel 97
Excel 97
Microsoft Excel 98, Macintosh edition
Excel 98
Microsoft Excel 2000, Polish
Excel 2000
Microsoft Excel 2001, Macintosh edition
Excel 2001
Microsoft Excel XP
Excel xp
Microsoft Excel v. X, Macintosh edition
Excel vx
Microsoft Excel 2003
Excel 2003
Microsoft Excel 2004, Macintosh edition
Excel 2004
Microsoft Excel 2007, beta 2
Excel 2007 beta2
Microsoft Excel 2007
Excel 2007

标签: 没有标签

使用WPF创建Office 2007功能区风格的自定义面板

Technorati 标签: ,,,

WPF,Windows Presentation Foundation,是Microsoft在.NET 3.0中引入的新组件,提供了表现层技术基础,用于统一处理用户界面和可视化元素。WPF的出现,使得用户开发具有震撼力的用户界面体验更加轻松和可能。同时,WPF是基于XAML(可扩展应用程序标记语言)来定义界面元素的。

下面是《Windows Presentation Foundation Unleashed》一书中使用WPF技术创建仿Office 2007 功能区的自定义面板的示例,所实现的结果如下图所示:

getRibbonCustomPanelpic

同时,记录下部分代码:

   1: Imports System
   2: Imports System.Windows
   3: Imports System.Windows.Controls
   4:  
   5: Namespace CustomPanel
   6:     Public Class RibbonPanel
   7:      Inherits Panel
   8:         Protected Overrides Function MeasureOverride(ByVal availableSize As Size) As Size
   9:             If Children.Count < 1 Then
  10:                  Return New Size(0, 0)
  11:             End If
  12:  
  13:             ‘ Ask the first child for its desired size, given unlimited space
  14:             Dim firstChild As UIElement =  Children(0) 
  15:             firstChild.Measure(New Size(Double.PositiveInfinity,Double.PositiveInfinity))
  16:  
  17:             ‘ If there’s only one child, this panel would like to be the exact same size
  18:             If Children.Count < 2 Then
  19:                  Return firstChild.DesiredSize
  20:             End If
  21:  
  22:             ‘ If not, calculate the desired width based on all children
  23:             Dim numRows As Double =  Math.Ceiling((Children.Count - 1) / 3d) 
  24:             Dim maxWidthForEachRemainingChild As Double =  0 
  25:  
  26:             Dim i As Integer
  27:             For  i = 1 To  Children.Count- 1  Step  i + 1
  28:                 ‘ Ask each child for its desired size, given unlimited space
  29:                 Dim child As UIElement =  Children(i) 
  30:                 child.Measure(New Size(Double.PositiveInfinity,Double.PositiveInfinity))
  31:  
  32:                 ‘ Keep track of the maximum width
  33:                 maxWidthForEachRemainingChild = Math.Max(child.DesiredSize.Width, maxWidthForEachRemainingChild)
  34:             Next
  35:  
  36:             Return New Size(
  37:                 firstChild.DesiredSize.Width + maxWidthForEachRemainingChild * numRows, ‘ total width
  38:                 Dim ‘ height = desired height of the first child As firstChild.DesiredSize.Height)
  39:         End Function
  40:  
  41:         Protected Overrides Function ArrangeOverride(ByVal finalSize As Size) As Size
  42:             If Children.Count < 1 Then
  43:                  Return finalSize
  44:             End If
  45:  
  46:             ‘ Give the first child its desired width but the height of the panel
  47:             Dim firstChild As UIElement =  Children(0) 
  48:             Dim childOrigin As Point =  New Point(0,0) 
  49:             Dim firstChildSize As Size =  New Size(firstChild.DesiredSize.Width,finalSize.Height) 
  50:             firstChild.Arrange(New Rect(childOrigin,firstChildSize))
  51:  
  52:             If Children.Count < 2 Then
  53:                  Return finalSize
  54:             End If
  55:  
  56:             ‘ Determine the size for all the remaining children
  57:             Dim numRows As Double =  Math.Ceiling((Children.Count - 1) / 3d) 
  58:             Dim childSize As Size =  New Size((finalSize.Width - firstChildSize.Width) / numRows,finalSize.Height / 3) 
  59:             childOrigin.X += firstChildSize.Width
  60:  
  61:             Dim i As Integer
  62:             For  i = 1 To  Children.Count- 1  Step  i + 1
  63:                 Dim child As UIElement =  Children(i) 
  64:                 child.Arrange(New Rect(childOrigin,childSize))
  65:  
  66:                 If i % 3 = 0 Then
  67:                     ‘ Start a new column
  68:                     childOrigin.X += childSize.Width
  69:                     childOrigin.Y = 0
  70:                 Else 
  71:                     childOrigin.Y += childSize.Height
  72:                 End If
  73:             Next
  74:  
  75:             ‘ Fill all the space given
  76:             Return finalSize
  77:         End Function
  78:     End Class
  79: End Namespace
标签: 没有标签

Microsoft关于BI的新博客站点

BI,即business intelligence(商业智能)。一个新的关于BI的Blog站点已开始了,其名称为BI博客,对这方面有兴趣的朋友可以关注该站点。
博客地址:
http://blogs.msdn.com/bi/
MSBIBLOG

标签: 没有标签

Google Chart API指南(3)

前面部分参见Google Chart API指南(2)
图表尺寸
使用chs=<width in pixels>x<height in pixels>指定图表尺寸,例如,chs=300×200生成300像素宽和200像素高的图表。
图表的最大可能区域是300000像素。最大极限的高度或宽度是1000像素,最大尺寸的例子是1000×300、300×1000、600×500、500×600、800×375和375×800。
图表数据
下面的编码格式是有用的:

  • 简单的编码有62种不同值的精度。允许每个数据点五个像素,对于折线图和条形图达到大约300像素是足够的。简单的编码适合于所有其他类型的图表而不管其大小。
  • 文本编码有1000种不同值的精度,使用在0.0和100.0之间的浮点数字。允许每个数据点五个像素,整数(1.0、2.0,等等)对于折线图和条形图达到大约500像素是足够的。如果需要更高的精度,包括单个的小数位(例如35.7)。文本编码适合于所有其他类型的图表而不管其大小。
  • 扩展的编码有4096种不同值的精度,最好用于需要大数据范围的大图表。

注意:文本编码需要几个字符来编码单个的数据点。简单的编码是最有效的,只为每个数据点使用一个字符。
简单的编码
使用chd=s:<chart data string>指定简单的编码,其中<chart data string>包含字符:A到Z、a到z、0到9、下划线(_)和逗号(,)。
注意:

  • 大写字母A = 0、B = 1 …… Z = 25 。
  • 小写字母a = 26、b= 27 …… z = 51。
  • 零 (0) = 52 …… 9 = 61。
  • 使用下划线(_)指定忽略的值。
  • 如果有多组数据,使用逗号(,)分隔每一组。

例如,两组数据:chd=s:ATb19,Mn5tz,其中在每一个数据组中 — A代表0,T 代表19,b 代表27,1 代表53,9 代表 61。
注意:对于简单的编码,Chart API在图表的底部使用值0绘制点,在顶部为61,沿着y轴均匀展开所有其他值。
文本编码
使用chd=t:<chart data string>指定文本编码,其中<chart data string>由从0(0.0)到100.0的浮点数、-1和管道字符(I)组成。
注意:

  • Zero (0.0) = 0, 1.0 = 1 and so on up to 100.0 = 100.
  • 零(0.0)=0,1.0=1…….直到100.0=100。
  • 使用-1指定忽略的值。
  • 如果有多组数据,使用管道字符(I)分隔每组数据。

例如:chd=t:10.0,58.0,95.0|30.0,8.0,63.0
注意:对于文本编码,Chart API在图表底部使用值0绘制点,在顶部为100.0,沿着y轴均匀展开所有其他值。
扩展的编码
使用chd=e:<chart data string>指定扩展的编码,其中<chart data string>包含成对字符:A 到 Z, a 到 z, 0 到 9, 连字号 (-), 句点 (.), 下划线 (_), 和逗号 (,).
注意:

  • AA = 0, AZ = 25, Aa = 26, Az = 51, A0 = 52, A9 = 61, A- = 62, A. = 63
    BA = 64, BZ = 89, Ba = 90, Bz = 115, B0 = 116, B9 = 125, B- = 126, B. = 127
    .A = 4032, .Z = 4057, .a = 4058, .z = 4083, .0 = 4084, .9 = 4093, .- = 4094, .. = 4095.
  • 使用两个下划线(__) 指定忽略的字符。
  • 如果有多组数据,使用逗号(,)分隔每组数据。

注意:对于文本编码,Chart API在图表底部使用值0绘制点,在顶部为4095,沿着y轴均匀展开所有其他值。
编码数据的JavaScript代码片断
编程转换现实数据成Chart API数据比手工转换更容易。
下面的JavaScript代码片断编码数据组成简单的编码。必须提供正数的数组作为数据组,不是正数的数据组值被编码为使用下划字符(_)的忽略值。
调用simpleEncode函数传递数组(values)和数组中的最大值(maxValue)。对于折线图和条形图,如果希望在最大值和图表顶部之间有空间,则使maxValue比数组中的最大值更大。
var simpleEncoding = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789′;

function simpleEncode(values,maxValue) {

var chartData = [’s:’];
  for (var i = 0; i < values.length; i++) {
  var currentValue = values[i];
  if (!isNaN(currentValue) && currentValue >= 0) {
  chartData.push(simpleEncoding.charAt(Math.round((simpleEncoding.length-1) * currentValue / maxValue)));
  }
  else {
  chartData.push(’_');
  }
  }
return chartData.join(”);
}
间隔尺寸的引导线
当心不要高估图表所需要的数据点数字。例如,要显示过去10年期间Britney Spears是如何流行,汇总每天搜集的查询导致多于3600个值。这将在URL中传递太多的数据,同时以这个间隔尺寸绘制图形没有意义:在1024像素宽的屏幕中一个数据点在屏幕中大约是一个像素的四分之一。正如下面的例子所演示的。
200×100的图表,具有20个数据点(每个数据点10像素):
GooglechartAPISample22
40个数据点(每个数据点5像素):
GooglechartAPISample23
80个数据点(每个数据点仅2.5像素):
GooglechartAPISample24
待续……

标签: , ,