1. 程式人生 > 實用技巧 >動態“修改”註冊點,實現任意點旋轉

動態“修改”註冊點,實現任意點旋轉

動態“修改”註冊點,實現任意點旋轉

/**
 *
 * *------------------------------------------*
 * |  *** 動態“修改”註冊點,實現任意點旋轉***  |
 * *------------------------------------------*
 *
 * 編輯修改收錄: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;
		}



		
		
		
		
		
	}

}