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 解析 XML1
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++
}
|
|