public static Point[][] getLogicalCenter(FinderPattern finderPattern) { int version = finderPattern.Version; Point[][] pointArray1 = new Point[1][]; for (int index = 0; index < 1; ++index) { pointArray1[index] = new Point[1]; } int[] numArray = new int[1]; int[] seed = LogicalSeed.getSeed(version); Point[][] pointArray2 = new Point[seed.Length][]; for (int index = 0; index < seed.Length; ++index) { pointArray2[index] = new Point[seed.Length]; } for (int index1 = 0; index1 < pointArray2.Length; ++index1) { for (int index2 = 0; index2 < pointArray2.Length; ++index2) { pointArray2[index2][index1] = new Point(seed[index2], seed[index1]); } } return(pointArray2); }
public static AlignmentPattern findAlignmentPattern(bool[][] image, FinderPattern finderPattern) { Point[][] logicalCenter = AlignmentPattern.getLogicalCenter(finderPattern); int patternDistance = logicalCenter[1][0].X - logicalCenter[0][0].X; return(new AlignmentPattern(AlignmentPattern.getCenter(image, finderPattern, logicalCenter), patternDistance)); }
public static FinderPattern findFinderPattern(bool[][] image) { Line[] lineCross = FinderPattern.FindLineCross(FinderPattern.FindLineAcross(image)); Point[] center; try { center = FinderPattern.GetCenter(lineCross); } catch (FinderPatternNotFoundException ex) { throw ex; } int[] angle = FinderPattern.GetAngle(center); Point[] pointArray = FinderPattern.Sort(center, angle); int[] width = FinderPattern.GetWidth(image, pointArray, angle); int[] moduleSize = new int[3] { (width[0] << QRCodeImageReader.DECIMAL_POINT) / 7, (width[1] << QRCodeImageReader.DECIMAL_POINT) / 7, (width[2] << QRCodeImageReader.DECIMAL_POINT) / 7 }; int version = FinderPattern.calcRoughVersion(pointArray, width); if (version > 6) { try { version = FinderPattern.CalcExactVersion(pointArray, angle, moduleSize, image); } catch (VersionInformationException ex) { } } return(new FinderPattern(pointArray, version, angle, width, moduleSize)); }
//get logical center coordinates of each alignment patterns public static Point[][] getLogicalCenter(FinderPattern finderPattern) { int version = finderPattern.Version; Point[][] logicalCenters = new Point[1][]; for (int i = 0; i < 1; i++) { logicalCenters[i] = new Point[1]; } int[] logicalSeeds = new int[1]; //create "column(row)-coordinates" which based on relative coordinates //int sqrtCenters = (version / 7) + 2; //logicalSeeds = new int[sqrtCenters]; //for(int i=0 ; i<sqrtCenters ; i++) { // logicalSeeds[i] = 6 + i * (4 + 4 * version) / (sqrtCenters - 1); // logicalSeeds[i] -= (logicalSeeds[i] - 2) % 4; //} logicalSeeds = LogicalSeed.getSeed(version); logicalCenters = new Point[logicalSeeds.Length][]; for (int i2 = 0; i2 < logicalSeeds.Length; i2++) { logicalCenters[i2] = new Point[logicalSeeds.Length]; } //create real relative coordinates for (int col = 0; col < logicalCenters.Length; col++) { for (int row = 0; row < logicalCenters.Length; row++) { logicalCenters[row][col] = new Point(logicalSeeds[row], logicalSeeds[col]); } } return(logicalCenters); }
internal static Point[] Sort(Point[] centers, int[] angle) { Point[] pointArray = new Point[3]; switch (FinderPattern.GetURQuadrant(angle)) { case 1: pointArray[1] = FinderPattern.GetPointAtSide(centers, 1, 2); pointArray[2] = FinderPattern.GetPointAtSide(centers, 2, 4); break; case 2: pointArray[1] = FinderPattern.GetPointAtSide(centers, 2, 4); pointArray[2] = FinderPattern.GetPointAtSide(centers, 8, 4); break; case 3: pointArray[1] = FinderPattern.GetPointAtSide(centers, 4, 8); pointArray[2] = FinderPattern.GetPointAtSide(centers, 1, 8); break; case 4: pointArray[1] = FinderPattern.GetPointAtSide(centers, 8, 1); pointArray[2] = FinderPattern.GetPointAtSide(centers, 2, 1); break; } for (int index = 0; index < centers.Length; ++index) { if (!centers[index].Equals(pointArray[1]) && !centers[index].Equals(pointArray[2])) { pointArray[0] = centers[index]; } } return(pointArray); }
//get logical center coordinates of each alignment patterns public static Point[][] getLogicalCenter(FinderPattern finderPattern) { int version = finderPattern.Version; Point[][] logicalCenters = new Point[1][]; for (int i = 0; i < 1; i++) { logicalCenters[i] = new Point[1]; } int[] logicalSeeds = new int[1]; //create "column(row)-coordinates" which based on relative coordinates //int sqrtCenters = (version / 7) + 2; //logicalSeeds = new int[sqrtCenters]; //for(int i=0 ; i<sqrtCenters ; i++) { // logicalSeeds[i] = 6 + i * (4 + 4 * version) / (sqrtCenters - 1); // logicalSeeds[i] -= (logicalSeeds[i] - 2) % 4; //} logicalSeeds = LogicalSeed.getSeed(version); logicalCenters = new Point[logicalSeeds.Length][]; for (int i2 = 0; i2 < logicalSeeds.Length; i2++) { logicalCenters[i2] = new Point[logicalSeeds.Length]; } //create real relative coordinates for (int col = 0; col < logicalCenters.Length; col++) { for (int row = 0; row < logicalCenters.Length; row++) { logicalCenters[row][col] = new Point(logicalSeeds[row], logicalSeeds[col]); } } return logicalCenters; }
public static AlignmentPattern findAlignmentPattern(bool[][] image, FinderPattern finderPattern) { Point[][] logicalCenters = getLogicalCenter(finderPattern); int logicalDistance = logicalCenters[1][0].X - logicalCenters[0][0].X; //With it converts in order to handle in the same way Point[][] centers = null; centers = getCenter(image, finderPattern, logicalCenters); return new AlignmentPattern(centers, logicalDistance); }
public static AlignmentPattern findAlignmentPattern(bool[][] image, FinderPattern finderPattern) { Point[][] logicalCenters = getLogicalCenter(finderPattern); int logicalDistance = logicalCenters[1][0].X - logicalCenters[0][0].X; //With it converts in order to handle in the same way Point[][] centers = null; centers = getCenter(image, finderPattern, logicalCenters); return(new AlignmentPattern(centers, logicalDistance)); }
internal static Line[] FindLineCross(Line[] lineAcross) { ArrayList arrayList1 = ArrayList.Synchronized(new ArrayList(10)); ArrayList arrayList2 = ArrayList.Synchronized(new ArrayList(10)); ArrayList arrayList3 = ArrayList.Synchronized(new ArrayList(10)); for (int index = 0; index < lineAcross.Length; ++index) { arrayList3.Add((object)lineAcross[index]); } for (int index1 = 0; index1 < arrayList3.Count - 1; ++index1) { arrayList2.Clear(); arrayList2.Add(arrayList3[index1]); for (int index2 = index1 + 1; index2 < arrayList3.Count; ++index2) { if (Line.IsNeighbor((Line)arrayList2[arrayList2.Count - 1], (Line)arrayList3[index2])) { arrayList2.Add(arrayList3[index2]); Line line = (Line)arrayList2[arrayList2.Count - 1]; if (arrayList2.Count * 5 > line.Length && index2 == arrayList3.Count - 1) { arrayList1.Add(arrayList2[arrayList2.Count / 2]); for (int index3 = 0; index3 < arrayList2.Count; ++index3) { arrayList3.Remove(arrayList2[index3]); } } } else if (FinderPattern.cantNeighbor((Line)arrayList2[arrayList2.Count - 1], (Line)arrayList3[index2]) || index2 == arrayList3.Count - 1) { Line line = (Line)arrayList2[arrayList2.Count - 1]; if (arrayList2.Count * 6 > line.Length) { arrayList1.Add(arrayList2[arrayList2.Count / 2]); for (int index3 = 0; index3 < arrayList2.Count; ++index3) { arrayList3.Remove(arrayList2[index3]); } break; } break; } } } Line[] lineArray = new Line[arrayList1.Count]; for (int index = 0; index < lineArray.Length; ++index) { lineArray[index] = (Line)arrayList1[index]; } return(lineArray); }
internal static int CalcExactVersion(Point[] centers, int[] angle, int[] moduleSize, bool[][] image) { bool[] target = new bool[18]; Point[] points = new Point[18]; Axis axis = new Axis(angle, moduleSize[1]); axis.Origin = centers[1]; for (int index1 = 0; index1 < 6; ++index1) { for (int index2 = 0; index2 < 3; ++index2) { Point point = axis.translate(index2 - 7, index1 - 3); target[index2 + index1 * 3] = image[point.X][point.Y]; points[index2 + index1 * 3] = point; } } FinderPattern.canvas.DrawPoints(points, Color_Fields.RED); int num; try { num = FinderPattern.checkVersionInfo(target); } catch (InvalidVersionInfoException ex1) { FinderPattern.canvas.Print("Version info error. now retry with other place one."); axis.Origin = centers[2]; axis.ModulePitch = moduleSize[2]; for (int index1 = 0; index1 < 6; ++index1) { for (int index2 = 0; index2 < 3; ++index2) { Point point = axis.translate(index1 - 3, index2 - 7); target[index2 + index1 * 3] = image[point.X][point.Y]; points[index1 + index2 * 3] = point; } } FinderPattern.canvas.DrawPoints(points, Color_Fields.RED); try { num = FinderPattern.checkVersionInfo(target); } catch (VersionInformationException ex2) { throw ex2; } } return(num); }
// For only version 1 which has no Alignement Patterns /* SamplingGrid getSamplingGrid1(FinderPattern finderPattern) { int sqrtNumArea = 1; int sqrtNumModules = finderPattern.getSqrtNumModules(); //get nummber of modules at side int sqrtNumAreaModules = sqrtNumModules / sqrtNumArea; Point[] centers = finderPattern.getCenter(); int logicalDistance = 14; SamplingGrid samplingGrid = new SamplingGrid(sqrtNumArea); Line baseLineX, baseLineY, gridLineX, gridLineY; ModulePitch modulePitch = new ModulePitch(); //store (up,left) order modulePitch.top = getAreaModulePitch(centers[0], centers[1], logicalDistance); modulePitch.left = getAreaModulePitch(centers[0], centers[2], logicalDistance); //X軸に垂直の基線(一般に縦) baseLineX = new Line( finderPattern.getCenter(FinderPattern.UL), finderPattern.getCenter(FinderPattern.DL)); Axis axis = new Axis(finderPattern.getAngle(), modulePitch.top); axis.setOrigin(baseLineX.getP1()); baseLineX.setP1(axis.translate(-3, -3)); axis.setModulePitch(modulePitch.left); axis.setOrigin(baseLineX.getP2()); baseLineX.setP2(axis.translate(-3, 3)); //Y軸に垂直の基線(一般に横) baseLineY = new Line(finderPattern.getCenter(FinderPattern.UL), finderPattern.getCenter(FinderPattern.UR)); axis.setModulePitch(modulePitch.left); axis.setOrigin(baseLineY.getP1()); baseLineY.setP1(axis.translate(-3, -3)); axis.setModulePitch(modulePitch.left); axis.setOrigin(baseLineY.getP2()); baseLineY.setP2(axis.translate(3, -3)); //baseLineX.translate(1,1); //baseLineY.translate(1,1); samplingGrid.initGrid(0, 0, sqrtNumAreaModules, sqrtNumAreaModules); for (int i = 0; i < sqrtNumAreaModules; i++) { gridLineX = new Line(baseLineX.getP1(), baseLineX.getP2()); axis.setOrigin(gridLineX.getP1()); axis.setModulePitch(modulePitch.top); gridLineX.setP1(axis.translate(i,0)); axis.setOrigin(gridLineX.getP2()); axis.setModulePitch(modulePitch.top); gridLineX.setP2(axis.translate(i,0)); gridLineY = new Line(baseLineY.getP1(), baseLineY.getP2()); axis.setOrigin(gridLineY.getP1()); axis.setModulePitch(modulePitch.left); gridLineY.setP1(axis.translate(0,i)); axis.setOrigin(gridLineY.getP2()); axis.setModulePitch(modulePitch.left); gridLineY.setP2(axis.translate(0,i)); samplingGrid.setXLine(0,0,i,gridLineX); samplingGrid.setYLine(0,0,i,gridLineY); } for (int ay = 0; ay < samplingGrid.getHeight(); ay++) { for (int ax = 0; ax < samplingGrid.getWidth();ax++) { canvas.drawLines(samplingGrid.getXLines(ax,ay), Color.BLUE); canvas.drawLines(samplingGrid.getYLines(ax,ay), Color.BLUE); } } return samplingGrid; }*/ //sampllingGrid[areaX][areaY][direction(x=0,y=1)][EachLines] /* SamplingGrid getSamplingGrid2_6(FinderPattern finderPattern, AlignmentPattern alignmentPattern) { Point centers[][] = alignmentPattern.getCenter(); centers[0][0] = finderPattern.getCenter(FinderPattern.UL); centers[1][0] = finderPattern.getCenter(FinderPattern.UR); centers[0][1] = finderPattern.getCenter(FinderPattern.DL); int sqrtNumModules = finderPattern.getSqrtNumModules(); //一辺当たりのモジュール数を得る SamplingGrid samplingGrid = new SamplingGrid(1); Line baseLineX, baseLineY, gridLineX, gridLineY; int logicalDistance = alignmentPattern.getLogicalDistance(); Axis axis = new Axis(finderPattern.getAngle(), finderPattern.getModuleSize()); ModulePitch modulePitch = new ModulePitch(); //top left bottom rightの順に格納 modulePitch.top = getAreaModulePitch(centers[0][0], centers[1][0], logicalDistance + 6); modulePitch.left = getAreaModulePitch(centers[0][0], centers[0][1], logicalDistance + 6); axis.setModulePitch(modulePitch.top); axis.setOrigin(centers[0][1]); modulePitch.bottom = getAreaModulePitch(axis.translate(0, -3), centers[1][1], logicalDistance + 3); axis.setModulePitch(modulePitch.left); axis.setOrigin(centers[1][0]); modulePitch.right = getAreaModulePitch(axis.translate(-3, 0), centers[1][1], logicalDistance + 3); //X軸に垂直の基線(一般に縦) baseLineX = new Line(); baseLineY = new Line(); axis.setOrigin(centers[0][0]); modulePitch.top = getAreaModulePitch(centers[0][0], centers[1][0], logicalDistance + 6); modulePitch.left = getAreaModulePitch(centers[0][0], centers[0][1], logicalDistance + 6); axis.setModulePitch(modulePitch.top); axis.setOrigin(centers[0][1]); modulePitch.bottom = getAreaModulePitch(axis.translate(0,-3), centers[1][1], logicalDistance + 3); axis.setModulePitch(modulePitch.left); axis.setOrigin(centers[1][0]); modulePitch.right = getAreaModulePitch(axis.translate(-3,0), centers[1][1], logicalDistance + 3); axis.setOrigin(centers[0][0]); axis.setModulePitch(modulePitch.top); baseLineX.setP1(axis.translate(-3,-3)); axis.setModulePitch(modulePitch.left); baseLineY.setP1(axis.translate(-3,-3)); axis.setOrigin(centers[0][1]); axis.setModulePitch(modulePitch.bottom); baseLineX.setP2(axis.translate(-3,3)); axis.setOrigin(centers[1][0]); axis.setModulePitch(modulePitch.right); baseLineY.setP2(axis.translate(3,-3)); baseLineX.translate(1,1); baseLineY.translate(1,1); samplingGrid.initGrid(0, 0, sqrtNumModules, sqrtNumModules); for (int i = 0; i < sqrtNumModules; i++) { gridLineX = new Line(baseLineX.getP1(), baseLineX.getP2()); axis.setOrigin(gridLineX.getP1()); axis.setModulePitch(modulePitch.top); gridLineX.setP1(axis.translate(i,0)); axis.setOrigin(gridLineX.getP2()); axis.setModulePitch(modulePitch.bottom); gridLineX.setP2(axis.translate(i,0)); gridLineY = new Line(baseLineY.getP1(), baseLineY.getP2()); axis.setOrigin(gridLineY.getP1()); axis.setModulePitch(modulePitch.left); gridLineY.setP1(axis.translate(0,i)); axis.setOrigin(gridLineY.getP2()); axis.setModulePitch(modulePitch.right); gridLineY.setP2(axis.translate(0,i)); samplingGrid.setXLine(0,0,i,gridLineX); samplingGrid.setYLine(0,0,i,gridLineY); } for (int ay = 0; ay < samplingGrid.getHeight(); ay++) { for (int ax = 0; ax < samplingGrid.getWidth();ax++) { canvas.drawLines(samplingGrid.getXLines(ax,ay), java.awt.Color.BLUE); canvas.drawLines(samplingGrid.getYLines(ax,ay), java.awt.Color.BLUE); } } return samplingGrid; } //for version 7-13 SamplingGrid getSamplingGrid7_13(FinderPattern finderPattern, AlignmentPattern alignmentPattern) { Point centers[][] = alignmentPattern.getCenter(); centers[0][0] = finderPattern.getCenter(FinderPattern.UL); centers[2][0] = finderPattern.getCenter(FinderPattern.UR); centers[0][2] = finderPattern.getCenter(FinderPattern.DL); int sqrtNumModules = finderPattern.getSqrtNumModules(); //一辺当たりのモジュール数を得る int sqrtNumArea = 2; int sqrtNumAreaModules = sqrtNumModules / sqrtNumArea; sqrtNumAreaModules++; SamplingGrid samplingGrid = new SamplingGrid(sqrtNumArea); Line baseLineX, baseLineY, gridLineX, gridLineY; int logicalDistance = alignmentPattern.getLogicalDistance(); Axis axis = new Axis(finderPattern.getAngle(), finderPattern.getModuleSize()); ModulePitch modulePitch; for (int ay = 0; ay < sqrtNumArea; ay++) { for (int ax = 0; ax < sqrtNumArea; ax++) { modulePitch = new ModulePitch(); //top left bottom rightの順に格納 baseLineX = new Line(); baseLineY = new Line(); axis.setModulePitch(finderPattern.getModuleSize()); if (ax == 0 && ay == 0) { axis.setOrigin(centers[0][0]); modulePitch.top = getAreaModulePitch(axis.translate(0,3), centers[1][0], logicalDistance + 3); modulePitch.left = getAreaModulePitch(axis.translate(3,0), centers[0][1], logicalDistance + 3); axis.setModulePitch(modulePitch.top); modulePitch.bottom = getAreaModulePitch(centers[0][1], centers[1][1], logicalDistance); axis.setModulePitch(modulePitch.left); modulePitch.right = getAreaModulePitch(centers[1][0], centers[1][1], logicalDistance); axis.setModulePitch(modulePitch.top); baseLineX.setP1(axis.translate(-3,-3)); axis.setModulePitch(modulePitch.left); baseLineY.setP1(axis.translate(-3,-3)); axis.setOrigin(centers[0][1]); axis.setModulePitch(modulePitch.bottom); baseLineX.setP2(axis.translate(-6,0)); axis.setOrigin(centers[1][0]); axis.setModulePitch(modulePitch.right); baseLineY.setP2(axis.translate(0,-6)); } else if (ax == 1 && ay == 0) { axis.setOrigin(centers[1][0]); modulePitch.top = getAreaModulePitch(axis.translate(0,-3), centers[2][0], logicalDistance + 3); modulePitch.left = getAreaModulePitch(centers[1][0], centers[1][1], logicalDistance); axis.setModulePitch(modulePitch.top); modulePitch.bottom = getAreaModulePitch(centers[1][1], centers[2][1], logicalDistance); axis.setModulePitch(modulePitch.left); axis.setOrigin(centers[2][0]); modulePitch.right = getAreaModulePitch(axis.translate(-3,0), centers[2][1], logicalDistance + 3); axis.setOrigin(centers[1][0]); axis.setModulePitch(modulePitch.left); baseLineX.setP1(axis.translate(0,-6)); baseLineY.setP1(axis.translate(0,-6)); baseLineX.setP2(centers[1][1]); axis.setOrigin(centers[2][0]); axis.setModulePitch(modulePitch.right); baseLineY.setP2(axis.translate(3,-3)); } else if (ax == 0 && ay == 1) { modulePitch.top = getAreaModulePitch(centers[0][1], centers[1][1], logicalDistance); axis.setOrigin(centers[0][2]); modulePitch.left = getAreaModulePitch(centers[0][1], axis.translate(3,0), logicalDistance + 3); axis.setModulePitch(modulePitch.top); modulePitch.bottom = getAreaModulePitch(axis.translate(0,-3), centers[1][2], logicalDistance + 3); axis.setModulePitch(modulePitch.bottom); modulePitch.right = getAreaModulePitch(centers[1][1], centers[1][2], logicalDistance); axis.setOrigin(centers[0][1]); axis.setModulePitch(modulePitch.top); baseLineX.setP1(axis.translate(-6,0)); baseLineY.setP1(axis.translate(-6,0)); axis.setOrigin(centers[0][2]); axis.setModulePitch(modulePitch.bottom); baseLineX.setP2(axis.translate(-3, 3)); baseLineY.setP2(centers[1][1]); } else if (ax == 1 && ay == 1) { modulePitch.top = getAreaModulePitch(centers[1][1], centers[2][1], logicalDistance); modulePitch.left = getAreaModulePitch(centers[1][1], centers[1][2], logicalDistance); modulePitch.bottom = getAreaModulePitch(centers[1][2], centers[2][2], logicalDistance); modulePitch.right = getAreaModulePitch(centers[2][1], centers[2][2], logicalDistance); baseLineX.setP1(centers[1][1]); baseLineY.setP1(centers[1][1]); axis.setOrigin(centers[1][2]); axis.setModulePitch(modulePitch.left); baseLineX.setP2(axis.translate(0,6)); axis.setOrigin(centers[2][1]); axis.setModulePitch(modulePitch.top); baseLineY.setP2(axis.translate(6,0)); } samplingGrid.initGrid(ax,ay, sqrtNumAreaModules, sqrtNumAreaModules); for (int i = 0; i < sqrtNumAreaModules; i++) { gridLineX = new Line(baseLineX.getP1(), baseLineX.getP2()); axis.setOrigin(gridLineX.getP1()); axis.setModulePitch(modulePitch.top); gridLineX.setP1(axis.translate(i,0)); axis.setOrigin(gridLineX.getP2()); axis.setModulePitch(modulePitch.bottom); gridLineX.setP2(axis.translate(i,0)); gridLineY = new Line(baseLineY.getP1(), baseLineY.getP2()); axis.setOrigin(gridLineY.getP1()); axis.setModulePitch(modulePitch.left); gridLineY.setP1(axis.translate(0,i)); axis.setOrigin(gridLineY.getP2()); axis.setModulePitch(modulePitch.right); gridLineY.setP2(axis.translate(0,i)); samplingGrid.setXLine(ax,ay,i,gridLineX); samplingGrid.setYLine(ax,ay,i,gridLineY); } } } for (int ay = 0; ay < samplingGrid.getHeight(); ay++) { for (int ax = 0; ax < samplingGrid.getWidth();ax++) { canvas.drawLines(samplingGrid.getXLines(ax,ay), java.awt.Color.BLUE); canvas.drawLines(samplingGrid.getYLines(ax,ay), java.awt.Color.BLUE); } } return samplingGrid; }*/ /// <summary> Generic Sampling grid method</summary> internal virtual SamplingGrid getSamplingGrid(FinderPattern finderPattern, AlignmentPattern alignmentPattern) { Point[][] centers = alignmentPattern.getCenter(); int version = finderPattern.Version; int sqrtCenters = (version / 7) + 2; centers[0][0] = finderPattern.getCenter(FinderPattern.UL); centers[sqrtCenters - 1][0] = finderPattern.getCenter(FinderPattern.UR); centers[0][sqrtCenters - 1] = finderPattern.getCenter(FinderPattern.DL); //int sqrtNumModules = finderPattern.getSqrtNumModules(); /// The number of modules per one side is obtained int sqrtNumArea = sqrtCenters - 1; //--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--// SamplingGrid samplingGrid = new SamplingGrid(sqrtNumArea); Line baseLineX, baseLineY, gridLineX, gridLineY; ///??? //Point[] targetCenters; //int logicalDistance = alignmentPattern.getLogicalDistance(); Axis axis = new Axis(finderPattern.getAngle(), finderPattern.getModuleSize()); ModulePitch modulePitch; // for each area : for (int ay = 0; ay < sqrtNumArea; ay++) { for (int ax = 0; ax < sqrtNumArea; ax++) { modulePitch = new ModulePitch(this); /// Housing to order baseLineX = new Line(); baseLineY = new Line(); axis.ModulePitch = finderPattern.getModuleSize(); Point[][] logicalCenters = AlignmentPattern.getLogicalCenter(finderPattern); Point upperLeftPoint = centers[ax][ay]; Point upperRightPoint = centers[ax + 1][ay]; Point lowerLeftPoint = centers[ax][ay + 1]; Point lowerRightPoint = centers[ax + 1][ay + 1]; Point logicalUpperLeftPoint = logicalCenters[ax][ay]; Point logicalUpperRightPoint = logicalCenters[ax + 1][ay]; Point logicalLowerLeftPoint = logicalCenters[ax][ay + 1]; Point logicalLowerRightPoint = logicalCenters[ax + 1][ay + 1]; if (ax == 0 && ay == 0) // left upper corner { if (sqrtNumArea == 1) { upperLeftPoint = axis.translate(upperLeftPoint, - 3, - 3); upperRightPoint = axis.translate(upperRightPoint, 3, - 3); lowerLeftPoint = axis.translate(lowerLeftPoint, - 3, 3); lowerRightPoint = axis.translate(lowerRightPoint, 6, 6); logicalUpperLeftPoint.translate(- 6, - 6); logicalUpperRightPoint.translate(3, - 3); logicalLowerLeftPoint.translate(- 3, 3); logicalLowerRightPoint.translate(6, 6); } else { upperLeftPoint = axis.translate(upperLeftPoint, - 3, - 3); upperRightPoint = axis.translate(upperRightPoint, 0, - 6); lowerLeftPoint = axis.translate(lowerLeftPoint, - 6, 0); logicalUpperLeftPoint.translate(- 6, - 6); logicalUpperRightPoint.translate(0, - 6); logicalLowerLeftPoint.translate(- 6, 0); } } else if (ax == 0 && ay == sqrtNumArea - 1) // left bottom corner { upperLeftPoint = axis.translate(upperLeftPoint, - 6, 0); lowerLeftPoint = axis.translate(lowerLeftPoint, - 3, 3); lowerRightPoint = axis.translate(lowerRightPoint, 0, 6); logicalUpperLeftPoint.translate(- 6, 0); logicalLowerLeftPoint.translate(- 6, 6); logicalLowerRightPoint.translate(0, 6); } else if (ax == sqrtNumArea - 1 && ay == 0) // right upper corner { upperLeftPoint = axis.translate(upperLeftPoint, 0, - 6); upperRightPoint = axis.translate(upperRightPoint, 3, - 3); lowerRightPoint = axis.translate(lowerRightPoint, 6, 0); logicalUpperLeftPoint.translate(0, - 6); logicalUpperRightPoint.translate(6, - 6); logicalLowerRightPoint.translate(6, 0); } else if (ax == sqrtNumArea - 1 && ay == sqrtNumArea - 1) // right bottom corner { lowerLeftPoint = axis.translate(lowerLeftPoint, 0, 6); upperRightPoint = axis.translate(upperRightPoint, 6, 0); lowerRightPoint = axis.translate(lowerRightPoint, 6, 6); logicalLowerLeftPoint.translate(0, 6); logicalUpperRightPoint.translate(6, 0); logicalLowerRightPoint.translate(6, 6); } else if (ax == 0) // left side { upperLeftPoint = axis.translate(upperLeftPoint, - 6, 0); lowerLeftPoint = axis.translate(lowerLeftPoint, - 6, 0); logicalUpperLeftPoint.translate(- 6, 0); logicalLowerLeftPoint.translate(- 6, 0); } else if (ax == sqrtNumArea - 1) // right { upperRightPoint = axis.translate(upperRightPoint, 6, 0); lowerRightPoint = axis.translate(lowerRightPoint, 6, 0); logicalUpperRightPoint.translate(6, 0); logicalLowerRightPoint.translate(6, 0); } else if (ay == 0) // top { upperLeftPoint = axis.translate(upperLeftPoint, 0, - 6); upperRightPoint = axis.translate(upperRightPoint, 0, - 6); logicalUpperLeftPoint.translate(0, - 6); logicalUpperRightPoint.translate(0, - 6); } else if (ay == sqrtNumArea - 1) // bottom { lowerLeftPoint = axis.translate(lowerLeftPoint, 0, 6); lowerRightPoint = axis.translate(lowerRightPoint, 0, 6); logicalLowerLeftPoint.translate(0, 6); logicalLowerRightPoint.translate(0, 6); } if (ax == 0) { logicalUpperRightPoint.translate(1, 0); logicalLowerRightPoint.translate(1, 0); } else { logicalUpperLeftPoint.translate(- 1, 0); logicalLowerLeftPoint.translate(- 1, 0); } if (ay == 0) { logicalLowerLeftPoint.translate(0, 1); logicalLowerRightPoint.translate(0, 1); } else { logicalUpperLeftPoint.translate(0, - 1); logicalUpperRightPoint.translate(0, - 1); } int logicalWidth = logicalUpperRightPoint.X - logicalUpperLeftPoint.X; int logicalHeight = logicalLowerLeftPoint.Y - logicalUpperLeftPoint.Y; if (version < 7) { logicalWidth += 3; logicalHeight += 3; } modulePitch.top = getAreaModulePitch(upperLeftPoint, upperRightPoint, logicalWidth - 1); modulePitch.left = getAreaModulePitch(upperLeftPoint, lowerLeftPoint, logicalHeight - 1); modulePitch.bottom = getAreaModulePitch(lowerLeftPoint, lowerRightPoint, logicalWidth - 1); modulePitch.right = getAreaModulePitch(upperRightPoint, lowerRightPoint, logicalHeight - 1); baseLineX.setP1(upperLeftPoint); baseLineY.setP1(upperLeftPoint); baseLineX.setP2(lowerLeftPoint); baseLineY.setP2(upperRightPoint); samplingGrid.initGrid(ax, ay, logicalWidth, logicalHeight); for (int i = 0; i < logicalWidth; i++) { gridLineX = new Line(baseLineX.getP1(), baseLineX.getP2()); axis.Origin = gridLineX.getP1(); axis.ModulePitch = modulePitch.top; gridLineX.setP1(axis.translate(i, 0)); axis.Origin = gridLineX.getP2(); axis.ModulePitch = modulePitch.bottom; gridLineX.setP2(axis.translate(i, 0)); samplingGrid.setXLine(ax, ay, i, gridLineX); } for (int i = 0; i < logicalHeight; i++) { gridLineY = new Line(baseLineY.getP1(), baseLineY.getP2()); axis.Origin = gridLineY.getP1(); axis.ModulePitch = modulePitch.left; gridLineY.setP1(axis.translate(0, i)); axis.Origin = gridLineY.getP2(); axis.ModulePitch = modulePitch.right; gridLineY.setP2(axis.translate(0, i)); samplingGrid.setYLine(ax, ay, i, gridLineY); } } } return samplingGrid; }
internal static Point[][] getCenter(bool[][] image, FinderPattern finderPattern, Point[][] logicalCenters) { int moduleSize = finderPattern.GetModuleSize(); Axis axis = new Axis(finderPattern.GetAngle(), moduleSize); int length = logicalCenters.Length; Point[][] pointArray = new Point[length][]; for (int index = 0; index < length; ++index) { pointArray[index] = new Point[length]; } axis.Origin = finderPattern.GetCenter(0); pointArray[0][0] = axis.translate(3, 3); AlignmentPattern.canvas.DrawCross(pointArray[0][0], Color_Fields.BLUE); axis.Origin = finderPattern.GetCenter(1); pointArray[length - 1][0] = axis.translate(-3, 3); AlignmentPattern.canvas.DrawCross(pointArray[length - 1][0], Color_Fields.BLUE); axis.Origin = finderPattern.GetCenter(2); pointArray[0][length - 1] = axis.translate(3, -3); AlignmentPattern.canvas.DrawCross(pointArray[0][length - 1], Color_Fields.BLUE); Point p1 = pointArray[0][0]; for (int index1 = 0; index1 < length; ++index1) { for (int index2 = 0; index2 < length; ++index2) { if ((index2 != 0 || index1 != 0) && (index2 != 0 || index1 != length - 1) && (index2 != length - 1 || index1 != 0)) { Point point1 = (Point)null; if (index1 == 0) { if (index2 > 0 && index2 < length - 1) { point1 = axis.translate(pointArray[index2 - 1][index1], logicalCenters[index2][index1].X - logicalCenters[index2 - 1][index1].X, 0); } pointArray[index2][index1] = new Point(point1.X, point1.Y); AlignmentPattern.canvas.DrawCross(pointArray[index2][index1], Color_Fields.RED); } else if (index2 == 0) { if (index1 > 0 && index1 < length - 1) { point1 = axis.translate(pointArray[index2][index1 - 1], 0, logicalCenters[index2][index1].Y - logicalCenters[index2][index1 - 1].Y); } pointArray[index2][index1] = new Point(point1.X, point1.Y); AlignmentPattern.canvas.DrawCross(pointArray[index2][index1], Color_Fields.RED); } else { Point point2 = axis.translate(pointArray[index2 - 1][index1], logicalCenters[index2][index1].X - logicalCenters[index2 - 1][index1].X, 0); Point point3 = axis.translate(pointArray[index2][index1 - 1], 0, logicalCenters[index2][index1].Y - logicalCenters[index2][index1 - 1].Y); pointArray[index2][index1] = new Point((point2.X + point3.X) / 2, (point2.Y + point3.Y) / 2 + 1); } if (finderPattern.Version > 1) { Point precisionCenter = AlignmentPattern.getPrecisionCenter(image, pointArray[index2][index1]); if (pointArray[index2][index1].DistanceOf(precisionCenter) < 6) { AlignmentPattern.canvas.DrawCross(pointArray[index2][index1], Color_Fields.RED); int num1 = precisionCenter.X - pointArray[index2][index1].X; int num2 = precisionCenter.Y - pointArray[index2][index1].Y; AlignmentPattern.canvas.Print("Adjust AP(" + (object)index2 + "," + (object)index1 + ") to d(" + (object)num1 + "," + (object)num2 + ")"); pointArray[index2][index1] = precisionCenter; } } AlignmentPattern.canvas.DrawCross(pointArray[index2][index1], Color_Fields.BLUE); AlignmentPattern.canvas.DrawLine(new Line(p1, pointArray[index2][index1]), Color_Fields.LIGHTBLUE); p1 = pointArray[index2][index1]; } } } return(pointArray); }
internal static Point[][] getCenter(bool[][] image, FinderPattern finderPattern, Point[][] logicalCenters) { int moduleSize = finderPattern.getModuleSize(); Axis axis = new Axis(finderPattern.getAngle(), moduleSize); int sqrtCenters = logicalCenters.Length; Point[][] centers = new Point[sqrtCenters][]; for (int i = 0; i < sqrtCenters; i++) { centers[i] = new Point[sqrtCenters]; } axis.Origin = finderPattern.getCenter(FinderPattern.UL); centers[0][0] = axis.translate(3, 3); canvas.drawCross(centers[0][0], MessagingToolkit.QRCode.Codec.Util.Color_Fields.BLUE); axis.Origin = finderPattern.getCenter(FinderPattern.UR); centers[sqrtCenters - 1][0] = axis.translate(-3, 3); canvas.drawCross(centers[sqrtCenters - 1][0], MessagingToolkit.QRCode.Codec.Util.Color_Fields.BLUE); axis.Origin = finderPattern.getCenter(FinderPattern.DL); centers[0][sqrtCenters - 1] = axis.translate(3, -3); canvas.drawCross(centers[0][sqrtCenters - 1], MessagingToolkit.QRCode.Codec.Util.Color_Fields.BLUE); Point tmpPoint = centers[0][0]; for (int y = 0; y < sqrtCenters; y++) { for (int x = 0; x < sqrtCenters; x++) { if ((x == 0 && y == 0) || (x == 0 && y == sqrtCenters - 1) || (x == sqrtCenters - 1 && y == 0)) { // canvas.drawCross(centers[x][y], java.awt.Color.MAGENTA); continue; } Point target = null; if (y == 0) { if (x > 0 && x < sqrtCenters - 1) { target = axis.translate(centers[x - 1][y], logicalCenters[x][y].X - logicalCenters[x - 1][y].X, 0); } centers[x][y] = new Point(target.X, target.Y); canvas.drawCross(centers[x][y], MessagingToolkit.QRCode.Codec.Util.Color_Fields.RED); } else if (x == 0) { if (y > 0 && y < sqrtCenters - 1) { target = axis.translate(centers[x][y - 1], 0, logicalCenters[x][y].Y - logicalCenters[x][y - 1].Y); } centers[x][y] = new Point(target.X, target.Y); canvas.drawCross(centers[x][y], MessagingToolkit.QRCode.Codec.Util.Color_Fields.RED); } else { Point t1 = axis.translate(centers[x - 1][y], logicalCenters[x][y].X - logicalCenters[x - 1][y].X, 0); Point t2 = axis.translate(centers[x][y - 1], 0, logicalCenters[x][y].Y - logicalCenters[x][y - 1].Y); centers[x][y] = new Point((t1.X + t2.X) / 2, (t1.Y + t2.Y) / 2 + 1); } if (finderPattern.Version > 1) { Point precisionCenter = getPrecisionCenter(image, centers[x][y]); if (centers[x][y].distanceOf(precisionCenter) < 6) { canvas.drawCross(centers[x][y], MessagingToolkit.QRCode.Codec.Util.Color_Fields.RED); int dx = precisionCenter.X - centers[x][y].X; int dy = precisionCenter.Y - centers[x][y].Y; canvas.println("Adjust AP(" + x + "," + y + ") to d(" + dx + "," + dy + ")"); centers[x][y] = precisionCenter; } } canvas.drawCross(centers[x][y], MessagingToolkit.QRCode.Codec.Util.Color_Fields.BLUE); canvas.drawLine(new Line(tmpPoint, centers[x][y]), MessagingToolkit.QRCode.Codec.Util.Color_Fields.LIGHTBLUE); tmpPoint = centers[x][y]; } } return(centers); }
internal static Line[] FindLineAcross(bool[][] image) { int num1 = 0; int num2 = 1; int length1 = image.Length; int length2 = image[0].Length; Point point = new Point(); ArrayList arrayList = ArrayList.Synchronized(new ArrayList(10)); int[] buffer = new int[5]; int pointer = 0; int num3 = num1; bool flag1 = false; while (true) { bool flag2 = image[point.X][point.Y]; if (flag2 == flag1) { ++buffer[pointer]; } else { if (!flag2 && FinderPattern.CheckPattern(buffer, pointer)) { int x1; int x2; int y2; int y1; if (num3 == num1) { x1 = point.X; for (int index = 0; index < 5; ++index) { x1 -= buffer[index]; } x2 = point.X - 1; y1 = y2 = point.Y; } else { x1 = x2 = point.X; y1 = point.Y; for (int index = 0; index < 5; ++index) { y1 -= buffer[index]; } y2 = point.Y - 1; } arrayList.Add((object)new Line(x1, y1, x2, y2)); } pointer = (pointer + 1) % 5; buffer[pointer] = 1; flag1 = !flag1; } if (num3 == num1) { if (point.X < length1 - 1) { point.Translate(1, 0); } else if (point.Y < length2 - 1) { point.Set(0, point.Y + 1); buffer = new int[5]; } else { point.Set(0, 0); buffer = new int[5]; num3 = num2; } } else if (point.Y < length2 - 1) { point.Translate(0, 1); } else if (point.X < length1 - 1) { point.Set(point.X + 1, 0); buffer = new int[5]; } else { break; } } Line[] lines = new Line[arrayList.Count]; for (int index = 0; index < lines.Length; ++index) { lines[index] = (Line)arrayList[index]; } FinderPattern.canvas.DrawLines(lines, Color_Fields.LIGHTGREEN); return(lines); }
internal static Point[][] getCenter(bool[][] image, FinderPattern finderPattern, Point[][] logicalCenters) { int moduleSize = finderPattern.getModuleSize(); Axis axis = new Axis(finderPattern.getAngle(), moduleSize); int sqrtCenters = logicalCenters.Length; Point[][] centers = new Point[sqrtCenters][]; for (int i = 0; i < sqrtCenters; i++) { centers[i] = new Point[sqrtCenters]; } axis.Origin = finderPattern.getCenter(FinderPattern.UL); centers[0][0] = axis.translate(3, 3); canvas.drawCross(centers[0][0], MessagingToolkit.QRCode.Codec.Util.Color_Fields.BLUE); axis.Origin = finderPattern.getCenter(FinderPattern.UR); centers[sqrtCenters - 1][0] = axis.translate(- 3, 3); canvas.drawCross(centers[sqrtCenters - 1][0], MessagingToolkit.QRCode.Codec.Util.Color_Fields.BLUE); axis.Origin = finderPattern.getCenter(FinderPattern.DL); centers[0][sqrtCenters - 1] = axis.translate(3, - 3); canvas.drawCross(centers[0][sqrtCenters - 1], MessagingToolkit.QRCode.Codec.Util.Color_Fields.BLUE); Point tmpPoint = centers[0][0]; for (int y = 0; y < sqrtCenters; y++) { for (int x = 0; x < sqrtCenters; x++) { if ((x == 0 && y == 0) || (x == 0 && y == sqrtCenters - 1) || (x == sqrtCenters - 1 && y == 0)) { // canvas.drawCross(centers[x][y], java.awt.Color.MAGENTA); continue; } Point target = null; if (y == 0) { if (x > 0 && x < sqrtCenters - 1) { target = axis.translate(centers[x - 1][y], logicalCenters[x][y].X - logicalCenters[x - 1][y].X, 0); } centers[x][y] = new Point(target.X, target.Y); canvas.drawCross(centers[x][y], MessagingToolkit.QRCode.Codec.Util.Color_Fields.RED); } else if (x == 0) { if (y > 0 && y < sqrtCenters - 1) { target = axis.translate(centers[x][y - 1], 0, logicalCenters[x][y].Y - logicalCenters[x][y - 1].Y); } centers[x][y] = new Point(target.X, target.Y); canvas.drawCross(centers[x][y], MessagingToolkit.QRCode.Codec.Util.Color_Fields.RED); } else { Point t1 = axis.translate(centers[x - 1][y], logicalCenters[x][y].X - logicalCenters[x - 1][y].X, 0); Point t2 = axis.translate(centers[x][y - 1], 0, logicalCenters[x][y].Y - logicalCenters[x][y - 1].Y); centers[x][y] = new Point((t1.X + t2.X) / 2, (t1.Y + t2.Y) / 2 + 1); } if (finderPattern.Version > 1) { Point precisionCenter = getPrecisionCenter(image, centers[x][y]); if (centers[x][y].distanceOf(precisionCenter) < 6) { canvas.drawCross(centers[x][y], MessagingToolkit.QRCode.Codec.Util.Color_Fields.RED); int dx = precisionCenter.X - centers[x][y].X; int dy = precisionCenter.Y - centers[x][y].Y; canvas.println("Adjust AP(" + x + "," + y + ") to d(" + dx + "," + dy + ")"); centers[x][y] = precisionCenter; } } canvas.drawCross(centers[x][y], MessagingToolkit.QRCode.Codec.Util.Color_Fields.BLUE); canvas.drawLine(new Line(tmpPoint, centers[x][y]), MessagingToolkit.QRCode.Codec.Util.Color_Fields.LIGHTBLUE); tmpPoint = centers[x][y]; } } return centers; }