29
2018
09

投影矩阵-一维投影

P_{A}=A(A^{T}A)^{{-1}}A^{T}\,

参考:维基百科-投影

PA 就是A的列空间的投影矩阵。比如A=[Vec1,Vec2],其中Vec1、Vec2都是列向量,向量b在A空间内的投影就是PA*b。

再通俗一点,A是一个平面,知道A里边的两个不平行的向量Vec1、Vec2,求任意一个向量b在平面A上的投影。

对于一维,就是,知道一个向量A,求向量b在A上的投影。

做了个demo:

效果:

获得 Adobe Flash Player


代码:

package  {

	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;


	public class Main extends MovieClip {

		public var pO:MovieClip;
		public var pA:MovieClip;
		public var pB:MovieClip;
		public function Main() {
			// constructor code
			drag(pO);
			drag(pA);
			drag(pB);
			addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}

		private function enterFrameHandler(e:Event):void 
		{
			var p0:Point = new Point(pO.x, pO.y);
			var p1:Point = new Point(pA.x, pA.y);
			var p2:Point = new Point(pB.x, pB.y);
			var p01:Point = p1.subtract(p0);
			var p02:Point = p2.subtract(p0);
			var A:Point = p02;
			var b:Point = p01;
			//

			//
			graphics.clear();
			graphics.lineStyle(4, 0x000000, 1.0);
			graphics.moveTo(p0.x, p0.y);
			graphics.lineTo(p1.x, p1.y);
			graphics.moveTo(p0.x, p0.y);
			graphics.lineTo(p2.x, p2.y);
			graphics.lineStyle(2, 0x000000, 1.0);
			graphics.moveTo(p0.x + b.x, p0.y + b.y);
			graphics.lineTo(p0.x + pb.x, p0.y + pb.y);
			graphics.lineStyle(2, 0xff0000, 1.0);
			graphics.moveTo(p0.x, p0.y);
			graphics.lineTo(p0.x + pb.x, p0.y + pb.y);

		}
		//-----------------------------
		private var curSp:Sprite;
		private function drag(sp:Sprite):void{
			sp.buttonMode = true;
			sp.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
		}

		private function mouseDownHandler(e:MouseEvent):void 
		{
			curSp = e.currentTarget as Sprite;
			curSp.startDrag();
			addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
			addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
			addEventListener(Event.MOUSE_LEAVE, mouseUpHandler);
		}

		private function mouseUpHandler(e:MouseEvent):void 
		{
			curSp.stopDrag();
			curSp = null;
			removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
			removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
			removeEventListener(Event.MOUSE_LEAVE, mouseUpHandler);
		}

		private function mouseMoveHandler(e:MouseEvent):void 
		{
			//
		}
	}

}

可以用于求点到线段上的垂线。


源码打包下载

« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。