public void SetLineProfile(Point startRealP, Point endRealP, ControlData condata) { EqData = new LineEqData(); LineData = new LineProfileData(); XData = new List <int>(); YData = new List <int>(); InitData(startRealP, endRealP, condata); }
void ChangeStartEndYorder(LineProfileData lineData) { if (lineData.StartPoint.Y > lineData.EndPoint.Y) { Point startPoint = lineData.EndPoint; Point endPoint = lineData.StartPoint; int startNumX = lineData.EndNumX; int endnumX = lineData.StartNumX; int startNumY = lineData.EndNumY; int endnumY = lineData.StartNumY; lineData.EndPoint = endPoint; lineData.StartPoint = startPoint; lineData.EndNumX = endnumX; lineData.StartNumX = startNumX; lineData.EndNumY = endnumY; lineData.StartNumY = startNumY; } }
byte[] YOrder(string[,] inputPath, LineProfileData lineData) { double resultForAssert = lineData.EndPoint.Y - lineData.StartPoint.Y; int x = LineData.StartNumX; int y = LineData.StartNumY; int xend = LineData.EndNumX; int yend = LineData.EndNumY; try { FormatConvert fcv = new FormatConvert(); /* y의 끝점이 한개의 이미지의 y끝점에서 안에 있는지, 이미지보다 위로 가는지 아래로 가는지*/ List <byte> outputlist = new List <byte>(); int innerSX = (int)lineData.StartPoint.X - x * ImgInfo.W; int innerSY = (int)lineData.StartPoint.Y - y * ImgInfo.H; int innerEY = (int)lineData.EndPoint.Y - yend * ImgInfo.H; while (true) { byte[,] data = fcv.Dat2Mat(inputPath[y, x]); // string[row,col] 순 이므로 [y,x] 순이 된다. double By = innerSX - EqData.Ay * innerSY; // ok if (y == lineData.EndNumY) { if (x == xend) { for (int j = innerSY; j < innerEY; j++) { int xPos = (int)(EqData.Ay * j + By - 1) >= 0? (int)(EqData.Ay * j + By - 1): 0; outputlist.Add(data[j, xPos]); } break; } else if (x > xend) { for (int j = innerSY; j < ImgInfo.W; j++) { if (EqData.Ax * j + By < 0) { innerSY = j; break; } int xPos = (int)(EqData.Ay * j + By - 1) >= 0 ? (int)(EqData.Ay * j + By - 1) : 0; outputlist.Add(data[j, xPos]); } innerSX = ImgInfo.W; x--; } else { for (int j = 0; j < ImgInfo.W; j++) { if (EqData.Ax * j + By > ImgInfo.W) { innerSY = j; break; } int xPos = (int)(EqData.Ay * j + By - 1) >= 0 ? (int)(EqData.Ay * j + By - 1) : 0; outputlist.Add(data[j, xPos]); } innerSX = 0; x++; } } // Y is in End else if (y == lineData.StartNumY) { if ((EqData.Ay * ImgInfo.H + By) < 0) { for (int j = innerSY; j < ImgInfo.H; j++) { if (EqData.Ay * j + By < 0) // 칸을 넘어갔을경우 { innerSY = j; break; } int xPos = (int)(EqData.Ay * j + By - 1) >= 0 ? (int)(EqData.Ay * j + By - 1) : 0; outputlist.Add(data[j, xPos]); } innerSX = ImgInfo.W; x--; } else if ((EqData.Ay * ImgInfo.H + By) > ImgInfo.W) { for (int j = 0; j < ImgInfo.H; j++) { if (EqData.Ay * j + By > ImgInfo.W) { innerSY = j; break; } int xPos = (int)(EqData.Ay * j + By - 1) >= 0 ? (int)(EqData.Ay * j + By - 1) : 0; outputlist.Add(data[j, xPos]); } innerSX = 0; x++; } else { for (int j = innerSY; j < ImgInfo.H; j++) { int xPos = (int)(EqData.Ay * j + By - 1) >= 0 ? (int)(EqData.Ay * j + By - 1) : 0; outputlist.Add(data[j, xPos]); } innerSY = 0; y++; } } else { if ((EqData.Ay * ImgInfo.H + By) < 0) { for (int j = innerSY; j < ImgInfo.H; j++) { if (EqData.Ay * j + By < 0) { innerSY = j; break; } int xPos = (int)(EqData.Ay * j + By - 1) >= 0 ? (int)(EqData.Ay * j + By - 1) : 0; outputlist.Add(data[j, xPos]); } innerSX = ImgInfo.W; x--; } else if ((EqData.Ay * ImgInfo.H + By) > ImgInfo.W) { for (int j = innerSY; j < ImgInfo.H; j++) { if (EqData.Ay * j + By > ImgInfo.W) { innerSY = j; break; } int xPos = (int)(EqData.Ay * j + By - 1) >= 0 ? (int)(EqData.Ay * j + By - 1) : 0; outputlist.Add(data[j, xPos]); } innerSX = 0; x++; } else { int xPos = 0; for (int j = innerSY; j < ImgInfo.H; j++) { xPos = (int)(EqData.Ay * j + By - 1) >= 0 ? (int)(EqData.Ay * j + By - 1) : 0; outputlist.Add(data[j, xPos]); } innerSY = 0; innerSX = xPos; y++; } } // Y is not in End } /* 하나의 라인데이터가 리스트로 저장이 된다. 이 리스트를 byte[] 로 변환해준다. */ byte[] output = ConvertList2ByteArr(outputlist); Debug.Assert(resultForAssert == output.Length); return(output); } catch (Exception eex) { Console.WriteLine(eex.ToString()); return(new byte[0]); } }
byte[] XOrder(string[,] inputPath, LineProfileData lineData) // lineData 는 문제없음. { double resultForAssert = lineData.EndPoint.X - lineData.StartPoint.X; int x = LineData.StartNumX; int y = LineData.StartNumY; int xend = LineData.EndNumX; int yend = LineData.EndNumY; try { FormatConvert fcv = new FormatConvert(); List <byte> outputlist = new List <byte>(); /* y의 끝점이 한개의 이미지의 y끝점에서 안에 있는지, 이미지보다 위로 가는지 아래로 가는지*/ int innerSX = (int)lineData.StartPoint.X - x * ImgInfo.W; int innerSY = (int)lineData.StartPoint.Y - y * ImgInfo.H; int innerEX = (int)lineData.EndPoint.X - xend * ImgInfo.W; while (true) { byte[,] data = fcv.Dat2Mat(inputPath[y, x]); // string[row,col] 순 이므로 [y,x] 순이 된다. =>ok double Bx = innerSY - EqData.Ax * innerSX; //inner 시작점 => ok if (x == lineData.EndNumX) // End { if (y == yend) { for (int j = innerSX; j < innerEX; j++) { int yPos = (int)(EqData.Ax * j + Bx - 1) >= 0 ? (int)(EqData.Ax * j + Bx - 1) : 0; outputlist.Add(data[yPos, j]); // j = x } break; } else if (y > yend) { for (int j = innerSX; j < ImgInfo.W; j++) { if (EqData.Ax * j + Bx < 0) { innerSX = j; break; } int yPos = (int)(EqData.Ax * j + Bx - 1) >= 0 ? (int)(EqData.Ax * j + Bx - 1) : 0; outputlist.Add(data[yPos, j]); // j = x } innerSY = ImgInfo.H; y--; } else { for (int j = innerSX; j < ImgInfo.W; j++) { if (EqData.Ax * j + Bx > ImgInfo.H) { innerSX = j; break; } int yPos = (int)(EqData.Ax * j + Bx - 1) >= 0 ? (int)(EqData.Ax * j + Bx - 1) : 0; outputlist.Add(data[yPos, j]); } innerSY = 0; y++; } } // X is in End else if (x == lineData.StartNumX) // Start { if ((EqData.Ax * ImgInfo.W + Bx) < 0) { for (int j = innerSX; j < ImgInfo.W; j++) { if (EqData.Ax * j + Bx < 0) { innerSX = j; innerSY = (y * ImgInfo.H); break; } int yPos = (int)(EqData.Ax * j + Bx - 1) >= 0 ? (int)(EqData.Ax * j + Bx - 1) : 0; outputlist.Add(data[yPos, j]); // j = x } innerSY = ImgInfo.H; y--; } else if ((EqData.Ax * ImgInfo.W + Bx) > ImgInfo.H) { for (int j = innerSX; j < ImgInfo.W; j++) { if (EqData.Ax * j + Bx > ImgInfo.H) { innerSX = j; innerSY = (y * ImgInfo.H); break; } int yPos = (int)(EqData.Ax * j + Bx - 1) >= 0 ? (int)(EqData.Ax * j + Bx - 1) : 0; outputlist.Add(data[yPos, j]); } innerSY = 0; y++; } else { int yPos = 0; for (int j = innerSX; j < ImgInfo.W; j++) { yPos = (int)(EqData.Ax * j + Bx - 1) >= 0 ? (int)(EqData.Ax * j + Bx - 1) : 0; outputlist.Add(data[yPos, j]); } innerSX = 0; innerSY = yPos; x++; } } else // Middle { if ((EqData.Ax * ImgInfo.W + Bx) < 0) { for (int j = 0; j < ImgInfo.W; j++) { if (EqData.Ax * j + Bx < 0) { innerSX = j; break; } int yPos = (int)(EqData.Ax * j + Bx - 1) >= 0 ? (int)(EqData.Ax * j + Bx - 1) : 0; outputlist.Add(data[yPos, j]); // j = x } innerSY = ImgInfo.H; y--; } else if ((EqData.Ax * ImgInfo.W + Bx) > ImgInfo.H) { for (int j = 0; j < ImgInfo.W; j++) { if (EqData.Ax * j + Bx > ImgInfo.H) { innerSX = j; break; } int yPos = (int)(EqData.Ax * j + Bx - 1) >= 0 ? (int)(EqData.Ax * j + Bx - 1) : 0; outputlist.Add(data[yPos, j]); } innerSY = 0; y++; } else // mid { int yPos = 0; for (int j = innerSX; j < ImgInfo.W; j++) { yPos = (int)(EqData.Ax * j + Bx - 1) >= 0 ? (int)(EqData.Ax * j + Bx - 1) : 0; outputlist.Add(data[yPos, j]); } innerSX = 0; innerSY = yPos; x++; } } // X is not in End } byte[] output = ConvertList2ByteArr(outputlist); Debug.Assert(resultForAssert == output.Length); return(output); } catch (Exception eex) { MessageBox.Show(eex.ToString()); return(new byte[0]); } }