public static TrnsData ToTrnsData (this AffinePos srcPos, int w, int h) { //inner w h var innerh = PosL2(srcPos.LB, srcPos.LT); var innerw = PosL2(srcPos.RT, srcPos.LT); var trgPos = srcPos.MoveToCenter(new PointD(w / 2.0, h / 2.0)); // ok var fcenterX = srcPos.GetCenter().X; var fcenterY = srcPos.GetCenter().Y; var lcenterX = trgPos.GetCenter().X; var lcenterY = trgPos.GetCenter().Y; var xshift = lcenterX - fcenterX; var yshift = lcenterY - fcenterY; var dx = srcPos.LT.X - srcPos.RT.X; var dy = srcPos.LT.Y - srcPos.RT.Y; if (dx == 0) { return(default(TrnsData)); } //var angle_degree = 360 - Math.Atan2(dy, dx) * 180 / Math.PI; //double radian; //angle_degree %= 360; //radian = PI / 180.0 * angle_degree; var radian = Math.Atan(dy / dx); var radian2 = Math.Atan2(dy, dx); return(new TrnsData() { H = h, W = w, XShift = (int)xshift, YShift = (int)yshift, Innerw = innerw, Innterh = innerh, XSrcCnter = (int)fcenterX, YSrcCnter = (int)fcenterY, dX = (int)dx, dY = (int)dy, Angle = radian, }); }
public static int[,] xytransform(int[,] src, AffinePos srcPos, AffinePos trgPos) { var h = src.GetLength(0); var w = src.GetLength(1); var fcenterX = srcPos.GetCenter().X; var fcenterY = srcPos.GetCenter().Y; var lcenterX = trgPos.GetCenter().X; var lcenterY = trgPos.GetCenter().Y; var xshift = (int)(lcenterX - fcenterX); var yshift = (int)(lcenterY - fcenterY); int[,] R = new int[h + Abs(yshift), w + Abs(xshift)]; for (int j = 0; j < h; j++) { for (int i = 0; i < w; i++) { if (i - xshift >= 0 && j - yshift >= 0 && i - xshift < R.GetLength(1) && j - yshift < R.GetLength(0)) { R[j - yshift, i - xshift] = src[j, i]; } } } // now R is shifted /* * var dx = Abs(srcPos.LT.X - srcPos.RT.X); * var dy = Abs(srcPos.LT.Y - srcPos.RT.Y); * if (dx == 0) return null; * var angle_degree = 360 - Math.Atan2(dy, dx)*180/Math.PI; * var rotationResult = rotateGeneral(R, R.GetLength(1), R.GetLength(0), angle_degree); * * return rotationResult; */ return(R); }