动态“修改”注册点,实现任意点旋转

 

/**
 *
 * *------------------------------------------*
 * |  *** 动态“修改”注册点,实现任意点旋转***  |
 * *------------------------------------------*
 *
 * 编辑修改收录:fengzi(疯子、wu341、wgq341)
 *
 * 不会写代码,我是代码搬运工。
 *
 * 联系方式:QQ(493712833)。
 *
 * 随   笔: https://www.cnblogs.com/fengziwu/
 *
 * 版权协议:请自觉遵守LGPL协议,欢迎修改、复制、转载、传播给更多需要的人。
 * 免责声明:任何因使用此软件导致的纠纷与软件/程序开发者无关。
 * 日   期: 2020.03.25
 *
 * * ------------------ Example -------------------- *
 * PointRegister.register(mc,new Point(100,50));
   PointRegister.rotate(mc,60)


 * 需要注意的点..使用register注册新的点时..是当前的状态为去注册旋转点, 
 * 就是说如果当前mc已经转了一定的角度..重新注册旋转点..与没旋转过的mc注册旋转点时位置会不一样.. 
 * 这里是需要注册的地方..
 */
 
 
package fengzi.util
{
	import flash.display.DisplayObject;
	import flash.geom.Point;
	import flash.utils.Dictionary;
	
	public class PointRegister
	{
		static private var _target:Dictionary;
		public function PointRegister()
		{
		}



		/**
		* 注册旋转点36 
		* @param    target  目标
		* @param    point   新注册点39          
		*/
		static public function register(target:DisplayObject, point:Point):void
		{
			if (! _target)
			{
				_target = new Dictionary();
			}
			_target[target] = {};
			var s:Object = _target[target];
			s["x"] = point.x;
			s["y"] = point.y;
			s["r"] = Point.distance(new Point(target.x,target.y),new Point(s["x"],s["y"]));
			s["d"] = Math.asin(Math.abs(s["y"] - target.y)/s["r"])/(Math.PI / 180);
			if (s["x"] > target.x && s["y"] < target.y)
			{
				s["d"] = 180 - s["d"];
			}
			else if (s["x"] > target.x && s["y"] > target.y)
			{
				s["d"] +=  180;
			}
			else if (s["x"] < target.x && s["y"] > target.y)
			{
				s["d"] = 360 - s["d"];
			}
		}
		
		/**
		* 以新的注册点旋转
		* @param    target    目标
		* @param    rotation  角度
		*/
		static public function rotate(target:DisplayObject,rotation:Number):void
		{
			if (! _target)
			{
				return;
			}
			if (! _target[target])
			{
				return;
			}
			var s:Object = _target[target];
			var r:Number = rotation - target.rotation;
			target.rotation = rotation;
			s["d"] +=  r;
			target.x = s["x"] + s["r"] * Math.cos((s["d"]) * Math.PI / 180);
			target.y = s["y"] + s["r"] * Math.sin((s["d"]) * Math.PI / 180);
		}



		/**
		* 取消注册
		* @param    target  目标
		*/
		static public function unregister(target:DisplayObject):void
		{
			if (! _target)
			{
				return;
			}
			if (! _target[target])
			{
				return;
			}
			_target[target] = null;
		}



		
		
		
		
		
	}

}

  

posted on 2020-09-20 21:51  疯子_wu  阅读(143)  评论(0编辑  收藏  举报