首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Flash 描述复杂的社交网络-3 实现

使用 Flash 描述复杂的社交网络-3 实现

ActionScript 的算法实现上文中提到,ActionScript  是一门专门用于进行矢量计算和图形显示的语言,但由于其基于浏览器和脚本语言的局限性,使其在进行一些复杂算法的计算效率上表现并不突出。下面介绍用它如何来实现 。
首先,读入记录一张图的 GraphML (本例中的所有边都是无向边),ActionScript 将读入的 XML 格式的文件转换成 XML 对象,代码如清单 3 所示。
清单 3. 读入 GraphML 文件并转换成 XML 对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private var xml:XML

public function loadData():void {
   var xmlLoader:URLLoader = new URLLoader()
   xmlLoader.dataFormat = URLLoaderDataFormat.TEXT
   xmlLoader.addEventListener(Event.COMPLETE, xmlCompleteHandler)
   xmlLoader.addEventListener(IOErrorEvent.IO_ERROR, xmlIOErrorHandler)
   var request:URLRequest = new URLRequest("data/graphml.xml")
   xmlLoader.load(request)
}

private function xmlCompleteHandler(e:Event):void {
(e.target as URLLoader).removeEventListener(Event.COMPLETE, xmlCompleteHandler)
(e. target as URLLoader).removeEventListener(IOErrorEvent.IO_ERROR, xmlIOErrorHandler)
   xml = new XML(e. target.data)
}

private function xmlIOErrorHandler(e:IOErrorEvent):void {
(e. target as URLLoader).removeEventListener(Event.COMPLETE, xmlCompleteHandler)
(e. target as URLLoader).removeEventListener(IOErrorEvent.IO_ERROR, xmlIOErrorHandler)
   //TODO: graphML loaded fail
}




ActionScript 同 JavaScript 一样支持 ECMAScript for XML(E4X)标准,可以通过简单的语法迅速将 XML 文档解析成自定义的模型对象,关于 E4X 的详细介绍,读者可以查看 参考资源。清单 4 中所解析的 XML 文档,读者可以查看 清单 2。由于篇幅原因略去了自定义类的代码,包括一个 Map 类来模拟 Map 数据结构以及三个模型类 Node、Edge、Graph 来存储点、边和图对象,读者可以查看 下载 的示例源代码。
清单 4. E4X 解析 XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
         var graph = new Graph(new Map(), new Map())
var tmpNode:Node = null
var tmpEdge:Edge = null
var nodeId:String, sourceId:String, targetId:String
var weight:Number
var edgeKey:int

for each (var node:XML in xml..node) {
    tmpNode = new Node()
    nodeId = node.@id
    tmpNode.id = ++graph.nodeCount
    graph.nodeMap.put(nodeId, tmpNode)
}

for each (var edge:XML in xml..edge) {
    tmpEdge = new Edge()
    sourceId = edge.@source
    targetId = edge.@target
    weight = parseFloat(edge.data.(@key == "weight").text().toXMLString()
    tmpEdge.src = graph.nodeMap.get(sourceId)
    tmpEdge.dest = graph.nodeMap.get(targetId)
    tmpEdge.weight = weight
    if (tmpEdge.src && tmpEdge.dest) {
        edgeKey = tmpEdge.src.id * 1000 + tmpEdge.dest.id
        graph.edgeMap.put(edgeKey, tmpEdge)
    }
    graph.edgeCount++
}

返回列表