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

📄 fisheyedistortion.as

📁 用于flash/flex的 as3的 2D图形图像图表的动态生成
💻 AS
字号:
package flare.vis.operator.distortion
{
	import flash.geom.Rectangle;
	
	/**
	 * Computes a graphical fisheye distortion of a graph view. This distortion 
	 * allocates more space to items near the layout anchor and less space to 
	 * items further away, magnifying space near the anchor and demagnifying 
	 * distant space in a continuous fashion.
	 * 
	 * <p>
	 * For more details on this form of transformation, see Manojit Sarkar and 
	 * Marc H. Brown, "Graphical Fisheye Views of Graphs", in Proceedings of 
	 * CHI'92, Human Factors in Computing Systems, p. 83-91, 1992. Available
	 * online at <a href="http://citeseer.ist.psu.edu/sarkar92graphical.html">
	 * http://citeseer.ist.psu.edu/sarkar92graphical.html</a>. 
	 * </p>
	 */
	public class FisheyeDistortion extends Distortion
	{
		private var _dx:Number; // x distortion factor
		private var _dy:Number; // y distortion factor
    	private var _ds:Number; // size distortion factor
		
		// --------------------------------------------------------------------
		
		/**
	     * Create a new FisheyeDistortion with the given distortion factors
	     * along the x and y directions.
	     * @param dx the distortion factor along the x axis (0 for none)
	     * @param dy the distortion factor along the y axis (0 for none)
	     * @param ds the distortion factor to use for sizes (0 for none)
	     */
		public function FisheyeDistortion(dx:Number=4, dy:Number=4, ds:Number=3) {
			_dx = dx;
			_dy = dy;
			_ds = ds;
			super(_dx>0, _dy>0, _ds>0);
		}
		
		/** @inheritDoc */
		protected override function xDistort(x:Number):Number
		{
			return fisheye(x, layoutAnchor.x, _dx, _b.left, _b.right);
		}
		
		/** @inheritDoc */
		protected override function yDistort(y:Number):Number
		{
			return fisheye(y, layoutAnchor.y, _dy, _b.top, _b.bottom);
		}
		
		/** @inheritDoc */
		protected override function sizeDistort(bb:Rectangle, x:Number, y:Number):Number
		{
			if (!distortX && !distortY) return 1;
			var fx:Number=1, fy:Number=1;
			var a:Number, min:Number, max:Number, v:Number;
			
	        if (distortX) {
	            a = layoutAnchor.x;
	            min = bb.left;
	            max = bb.right;
	            v = Math.abs(min-a) > Math.abs(max-a) ? min : max;
	            if (v < _b.left || v > _b.right) v = (v==min ? max : min);
	            fx = fisheye(v, a, _dx, _b.left, _b.right);
	            fx = Math.abs(x-fx) / (max - min);
	        }
	
	        if (distortY) {
	        	a = layoutAnchor.y;
	        	min = bb.top;
	        	max = bb.bottom;
	        	v = Math.abs(min-a) > Math.abs(max-a) ? min : max;
	        	if (v < _b.top || v > _b.bottom) v = (v==min ? max : min);
	            fy = fisheye(v, a, _dy, _b.top, _b.bottom);
	            fy = Math.abs(y-fy) / (max - min);
	        }
	        
	        var sf:Number = (!distortY ? fx : (!distortX ? fy : Math.min(fx,fy)));
	        return (!isFinite(sf) || isNaN(sf)) ? 1 : _ds * sf;
		}
		
		private function fisheye(x:Number, a:Number, d:Number, 
			min:Number, max:Number) : Number
		{
	        if (d == 0) return x;
	        
	        var left:Boolean = x<a;
	        var v:Number, m:Number = (left ? a-min : max-a);
	        if ( m == 0 ) m = max-min;
	        v = Math.abs(x - a) / m;
	        v = (d+1)/(d+(1/v));
	        return (left?-1:1)*m*v + a;
	    }
		
	} // end of class FisheyeDistortion
}

⌨️ 快捷键说明

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