前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不可思议的Excel图表11: 实现运动诱发失明(MIB)动画模型

不可思议的Excel图表11: 实现运动诱发失明(MIB)动画模型

作者头像
fanjy
发布2019-07-19 11:09:15
9920
发布2019-07-19 11:09:15
举报
文章被收录于专栏:完美Excel

学习Excel技术,关注微信公众号:

excelperfect

这个炫酷的图表仍然来自excelhero.com。正如之前提到过的,通过学习研究复杂的图表制作,无论是否能够完全明白,都会很好地提高我们的Excel绘图能力。

下面是一组旋转的蓝色十字架和3个黄点。现在,注意中心(观看闪烁的红色/绿色斑点)。注意,黄色斑点偶尔消失:单独、成对或同时全部三个,是不是?

现实中,3个黄点不断出现,这被称为“运动诱发失明”或MIB。

图1

实际的MIB Excel模型比这个动画的GIF表示更平滑。

MIB模型

这里有三种用于这种视错觉的方法。

1.使用单个系列定义所有点(49个)并在每个点上放置一个十字。

图2

2.使用2系列来定义每个十字架,有49个十字架。

图3

3.使用包括十字架并旋转的位图作为背景。

第一种方法不适合视觉的需要,因为每个标记不会随着系列的旋转而旋转,而是相对于序数轴保持固定。

第二种方法为每个十字交叉准备大量坐标,即每个十字交叉的4个X和4个Y坐标,有49个交叉,总共98个系列和196个坐标。虽耗费时间,但至少十字架会旋转。这是示例模型选择的方法。

图4

第三种方法旋转固定位图虽然非常可行,但我们是要在Excel图表中来完成这所有的工作。最后的附件中有真实模型和所有相关的准备工作,你可以下载研究。下面介绍的所有准备工作都在附件工作表“2”上。

设置

首先,我在X和Y中设置一个数字-3到+3的表格,然后在每个表格中增加/减少一个小的数来表示十字的宽度。这里使用的是0.15。

下表是每个点的X和Y值。

图5

使用X和Y值的问题是围绕点旋转它们,使用极坐标会更容易,但Excel需要笛卡尔坐标绘图。于是,处理过程如下:

1.设置49个点的4组X、Y

2.将它们转换为极坐标

3.对每个端点设置命名公式

4.对修正的极坐标添加径向增量

5.使用命名公式转换极坐标为笛卡尔坐标

6.绘图

7.从第4步重复

极坐标

上述处理过程中第2步意味着将每组坐标转换为由半径r和角度Ø组成的极坐标。

图6

通过下式解决:

图7

对每个十字的每个端点,98对XY坐标进行处理。

现在,有了端点的极坐标,可以设置旋转方程。

这是将原始极坐标转换回X和Y值的公式,Excel需要绘制这些值。

图8

现在,可以添加一个旋转角度,这里使用t。这样,旋转后的新位置就是:

图9

为所有十字交叉的十字的每个点都这样处理:

图10

矩阵算术

要在散点图上绘制线条,Excel需要在单元格区域或数组中的2个X值,以及同样的2个Y值。可以在一个命名公式中一起添加2个命名公式来创建数组,这样最终得到一个数组,代表49个十字交叉的98段中每一段的X和Y值。

X值 = {X1,X2}

Y值 = {Y1,Y2}

所使用的其中一个命名公式为:

图11

为了简化所有这些的构建,坐标、转换到极坐标和构造旋转变换公式都是在Excel中完成的(参见示例文件中的工作表“2”)。

下面是实现这些命名公式的VBA代码:

代码语言:javascript
复制
Sub Load_Named_Ranges()
  Dim c As Range
  For Each c In Selection
    ActiveWorkbook.Names.Add Name:=c.Text,RefersTo:=c.Offset(, 1).Text
  Next
End Sub

添加图表系列

一旦构造并装载了命名公式,就只需在Excel中添加空白散点图并设置系列名称、X值和Y值的表:

图12

使用VBA代码将这些系列添加到图表中。

代码语言:javascript
复制
Sub Add_Cht_Series()
  Dim sNumb As Integer
  Dim c As Range
 Worksheets("1").ChartObjects("Chart 1").Activate
  For Each c InWorksheets("1").Range("AQ3:AQ100")
    sNumb = ActiveChart.SeriesCollection.Count+ 1
    ActiveChart.SeriesCollection.NewSeries
    ActiveChart.SeriesCollection(sNumb).Name =c.Text
    ActiveChart.SeriesCollection(sNumb).XValues= c.Offset(, 1).Text
    ActiveChart.SeriesCollection(sNumb).Values =c.Offset(, 2).Text
  Next
End Sub

3个黄点

使用下列坐标在图表中手动添加3个黄点:

X系列:={1.5,0,-1.5}

Y系列:={1.5,-1.8,1.5}

将标记设置为黄色,大小为15,线型设置为无。

中心点

中心点是图表中手动添加的系列:

X值:=0

Y值:=0

将标记设置为红色,大小为12,线型设置为无。

动画

添加简单的命名公式“t”,更改t的值并更新图表来实现图表的动画。

代码语言:javascript
复制
Sub Rotate()
  Dim t As Double
  t = 361 '在361度开始
  Do While [AA1] '单元格AA1是True时循环
    t = t - 1 '旋转角度减小1度
    If t = 0 Then t = 360 '如果旋转角为0则回到360
    '添加命名公式=t * 2 * Pi / 360
    't以弧度表示
    ActiveWorkbook.Names.Add Name:="t",RefersToR1C1:=(t * 2 * Pi / 360)
    '刷新屏幕
    DoEvents
    '如果t在指定范围内则设置中心标记颜色为红色或绿色
    If (t >= 0 And t < 90) Or (t >=180 And t < 270) Then
      ActiveSheet.ChartObjects("Chart1").Chart.SeriesCollection(99).Format.Fill.ForeColor.RGB = RGB(255, 0, 0)
    Else
      ActiveSheet.ChartObjects("Chart1").Chart.SeriesCollection(99).Format.Fill.ForeColor.RGB = RGB(0, 255, 0)
    End If
    'DoEvents
  Loop
End Sub

如果有兴趣深入研究本文介绍的图表是如何实现的,可以在完美Excel公众号中发送消息:

MIB动画图

下载示例工作簿。

或者到原作者的网站:

http://www.excelhero.com/blog/2012/02/motion-induced-blindness.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档