⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linkdistance.as

📁 用于flash/flex的 as3的 2D图形图像图表的动态生成
💻 AS
字号:
package flare.analytics.graph
{
	import flare.animate.Transitioner;
	import flare.util.Property;
	import flare.vis.data.Data;
	import flare.vis.data.EdgeSprite;
	import flare.vis.data.NodeSprite;
	import flare.vis.operator.Operator;
	
	/**
	 * Calculates the link distance from a source node based on a breadth-first
	 * traversal. Link distance is calculated as the smallest number of edges
	 * connecting a node to a source node. Any edge weights are ignored, to
	 * include weighted edges in the calculation, use the
	 * <code>ShortestPaths</code> operator instead.
	 * 
	 * </p>Nodes are annotated with both the computed distance and the incoming
	 * edge in the shortest link distance path to a source node. Edges are
	 * annotated with a Boolean value indicating whether or not the edge lies
	 * along one of these computed shortest paths.</p>
	 */
	public class LinkDistance extends Operator
	{
		private var _d:Property = Property.$("props.distance");
		private var _p:Property = Property.$("props.incoming");
		private var _e:Property = Property.$("props.onpath");
		private var _links:int = NodeSprite.GRAPH_LINKS;
		
		/** The roots of the breadth-first search. The elements of the array
		 *  should either be NodeSprite instances or integer indices into
		 *  the node array. */
		public var sources:Array;
		
		/** The property in which to store the link distance. This property
		 *  is used to annotate nodes with the minimum link distance to one of
		 *  the source nodes. The default value is "props.distance". */
		public function get distanceField():String { return _d.name; }
		public function set distanceField(f:String):void { _d = Property.$(f); }
		
		/** The property in which to store incoming edges along a shortest
		 *  path. This property is used to annotate nodes with the incoming
		 *  along a shortest path from one of the source nodes. By following
		 *  sequential incoming edges, one can recreate the shortest path from
		 *  the nearest source node. The default value is "props.incoming". */
		public function get incomingField():String { return _p.name; }
		public function set incomingField(f:String):void { _p = Property.$(f); }
		
		/** The property in which to store a path inclusion flag for edges.
		 *  This property is used to mark edges as belonging to one of the
		 *  computed shortest paths: <code>true</code> indicates that the edge
		 *  participates in a shortest path, <code>false</code> indicates that
		 *  the edge does not lie along a shortest path. The default value is
		 *  "props.onpath". */
		public function get onpathField():String { return _p.name; }
		public function set onpathField(f:String):void { _p = Property.$(f); }
		
		/** The link type to consider when calculating link distance. Should
		 *  be one of <code>NodeSprite.GRAPH_LINKS</code>,
		 *  <code>NodeSprite.IN_LINKS</code>, or
		 *  <code>NodeSprite.OUT_LINKS</code>. */
		public function get links():int { return _links; }
		public function set links(linkType:int):void {
			if (linkType == NodeSprite.GRAPH_LINKS ||
				linkType == NodeSprite.IN_LINKS ||
				linkType == NodeSprite.OUT_LINKS) 
			{
				_links = linkType;
			} else {
				throw new Error("Unsupported link type: "+linkType);
			}
		}
		
		// --------------------------------------------------------------------
		
		/**
		 * Creates a new LinkDistance operator.
		 * @param sources an Array specifying the roots of the breadth-first
		 *  search. The elements of the array should either be
		 *  <code>NodeSprite</code> instances or integer indices into the node
		 *  array.
		 */
		public function LinkDistance(sources:Array=null)
		{
			this.sources = sources;
		}
		
		/** @inheritDoc */
		public override function operate(t:Transitioner=null):void
		{
			calculate(visualization.data, sources);
		}
			
		/**
		 * Calculates link distances from a set of source nodes for for each
		 * node in the graph. Each node in the graph will be annotated with
		 * its link distance from the nearest source node.
		 * @param data the graph to calculate distances for
		 * @param sources one or more source nodes from which to measure the
		 *  distance. This input can either be a single node or an array of
		 *  nodes. Nodes can be indicated as either a <code>NodeSprite</code>
		 *  instance or an integer index into the <code>data.nodes</code>
		 *  property.
		 */
		public function calculate(data:Data, sources:*):void
		{
			var i:int, n:NodeSprite;
			data.edges.setProperty(_e.name, false);
			data.nodes.visit(function(n:NodeSprite):void {
				_d.setValue(n, Number.POSITIVE_INFINITY);
				_p.setValue(n, null);
			});
						
			// initialize queue
			var roots:Array = sources is Array ? sources as Array : [sources];
			var queue:Array = [];
			for (i=0; i<roots.length; ++i) {
				var r:Object = roots[i];
				if (r is NodeSprite) {
					n = NodeSprite(r);
				} else if (r is int) {
					n = data.nodes[int(r)];
				}
				queue.push(n);
				_d.setValue(n, 0);
			}
			
			while (queue.length > 0) {
				var u:NodeSprite = queue.shift();
				var du:int = _d.getValue(u) + 1;
				u.visitEdges(function(e:EdgeSprite):void {
					var v:NodeSprite = e.other(u);
					var d:Number = _d.getValue(v);
					if (!isFinite(d)) {
						queue.push(v);
						_d.setValue(v, du); 
						_p.setValue(v, e);
					} else if (d > du) {
						_d.setValue(v, du);
						_p.setValue(v, e);
					}
				}, _links);
			}
			
			data.nodes.visit(function(n:NodeSprite):void {
				var e:EdgeSprite = _p.getValue(n);
				if (e) _e.setValue(e, true);
			});
		}
		
	} // end of class LinkDistance
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -