📄 finderpattern.java
字号:
if (originPoint.getY() <= remoteLine.getP1().getY() & //1st or 2nd quadrant originPoint.getY() <= remoteLine.getP2().getY()) if (remoteLine.getP1().getX() < remoteLine.getP2().getX()) remotePoint = remoteLine.getP2(); else remotePoint = remoteLine.getP1(); else if (originPoint.getX() >= remoteLine.getP1().getX() & //2nd or 3rd quadrant originPoint.getX() >= remoteLine.getP2().getX()) if (remoteLine.getP1().getY() < remoteLine.getP2().getY()) remotePoint = remoteLine.getP2(); else remotePoint = remoteLine.getP1(); else if (originPoint.getY() >= remoteLine.getP1().getY() & //3rd or 4th quadrant originPoint.getY() >= remoteLine.getP2().getY()) if (remoteLine.getP1().getX() < remoteLine.getP2().getX()) remotePoint = remoteLine.getP1(); else remotePoint = remoteLine.getP2(); else //1st or 4th quadrant if (remoteLine.getP1().getY() < remoteLine.getP2().getY()) remotePoint = remoteLine.getP1(); else remotePoint = remoteLine.getP2(); int r = new Line(originPoint, remotePoint).getLength(); //canvas.println(Integer.toString(((remotePoint.getX() - originPoint.getX()) << QRCodeImageReader.DECIMAL_POINT))); int angle[] = new int[2]; angle[0] = ((remotePoint.getY() - originPoint.getY()) << QRCodeImageReader.DECIMAL_POINT) / r; //Sin angle[1] = ((remotePoint.getX() - originPoint.getX()) << (QRCodeImageReader.DECIMAL_POINT)) / r; //Cos return angle; } static Point[] getCenter(Line[] crossLines) throws FinderPatternNotFoundException { Vector centers = new Vector(); for (int i = 0; i < crossLines.length - 1; i++) { Line compareLine = crossLines[i]; for (int j = i + 1; j < crossLines.length; j++) { Line comparedLine = crossLines[j]; if (Line.isCross(compareLine, comparedLine)) { int x = 0; int y = 0; if (compareLine.isHorizontal()) { x = compareLine.getCenter().getX(); y = comparedLine.getCenter().getY(); } else { x = comparedLine.getCenter().getX(); y = compareLine.getCenter().getY(); } centers.addElement(new Point(x,y)); } } } Point[] foundPoints = new Point[centers.size()]; for (int i = 0; i < foundPoints.length; i++) { foundPoints[i] = (Point)centers.elementAt(i); //System.out.println(foundPoints[i]); } //System.out.println(foundPoints.length); if (foundPoints.length == 3) { canvas.drawPolygon(foundPoints, Color.RED); return foundPoints; } else throw new FinderPatternNotFoundException("Invalid number of Finder Pattern detected"); } //sort center of finder patterns as Left-Up: points[0], Right-Up: points[1], Left-Down: points[2]. static Point[] sort(Point[] centers, int[] angle) { Point[] sortedCenters = new Point[3]; int quadrant = getURQuadrant(angle); switch (quadrant) { case 1: sortedCenters[1] = getPointAtSide(centers, Point.RIGHT, Point.BOTTOM); sortedCenters[2] = getPointAtSide(centers, Point.BOTTOM, Point.LEFT); break; case 2: sortedCenters[1] = getPointAtSide(centers, Point.BOTTOM, Point.LEFT); sortedCenters[2] = getPointAtSide(centers, Point.TOP, Point.LEFT); break; case 3: sortedCenters[1] = getPointAtSide(centers, Point.LEFT, Point.TOP); sortedCenters[2] = getPointAtSide(centers, Point.RIGHT, Point.TOP); break; case 4: sortedCenters[1] = getPointAtSide(centers, Point.TOP, Point.RIGHT); sortedCenters[2] = getPointAtSide(centers, Point.BOTTOM, Point.RIGHT); break; } //last of centers is Left-Up patterns one for (int i = 0; i < centers.length; i++) { if (!centers[i].equals(sortedCenters[1]) && !centers[i].equals(sortedCenters[2])) { sortedCenters[0] = centers[i]; } } return sortedCenters; } static int getURQuadrant(int[] angle) { int sin = angle[0]; int cos = angle[1]; if (sin >= 0 && cos > 0) return 1; else if (sin > 0 && cos <= 0) return 2; else if (sin <= 0 && cos < 0) return 3; else if (sin < 0 && cos >= 0) return 4; return 0; } static Point getPointAtSide(Point[] points, int side1, int side2) { Point sidePoint = new Point(); int x = ((side1 == Point.RIGHT || side2 == Point.RIGHT) ? 0 : Integer.MAX_VALUE); int y = ((side1 == Point.BOTTOM || side2 == Point.BOTTOM) ? 0 : Integer.MAX_VALUE); sidePoint = new Point(x, y); for (int i = 0; i < points.length; i++) { switch (side1) { case Point.RIGHT: if (sidePoint.getX() < points[i].getX()) { sidePoint = points[i]; } else if (sidePoint.getX() == points[i].getX()) { if (side2 == Point.BOTTOM) { if (sidePoint.getY() < points[i].getY()) { sidePoint = points[i]; } } else { if (sidePoint.getY() > points[i].getY()) { sidePoint = points[i]; } } } break; case Point.BOTTOM: if (sidePoint.getY() < points[i].getY()) { sidePoint = points[i]; } else if (sidePoint.getY() == points[i].getY()) { if (side2 == Point.RIGHT) { if (sidePoint.getX() < points[i].getX()) { sidePoint = points[i]; } } else { if (sidePoint.getX() > points[i].getX()) { sidePoint = points[i]; } } } break; case Point.LEFT: if (sidePoint.getX() > points[i].getX()) { sidePoint = points[i]; } else if (sidePoint.getX() == points[i].getX()) { if (side2 == Point.BOTTOM) { if (sidePoint.getY() < points[i].getY()) { sidePoint = points[i]; } } else { if (sidePoint.getY() > points[i].getY()) { sidePoint = points[i]; } } } break; case Point.TOP: if (sidePoint.getY() > points[i].getY()) { sidePoint = points[i]; } else if (sidePoint.getY() == points[i].getY()) { if (side2 == Point.RIGHT) { if (sidePoint.getX() < points[i].getX()) { sidePoint = points[i]; } } else { if (sidePoint.getX() > points[i].getX()) { sidePoint = points[i]; } } } break; } } return sidePoint; } static int[] getWidth(boolean[][] image, Point[] centers, int[] sincos) throws ArrayIndexOutOfBoundsException { int[] width = new int[3]; for (int i = 0; i < 3; i++) { boolean flag = false; int lx, rx; int y = centers[i].getY(); for (lx = centers[i].getX(); lx >= 0; lx--) { if (image[lx][y] == QRCodeImageReader.POINT_DARK && image [lx - 1][y] == QRCodeImageReader.POINT_LIGHT) { if (flag == false) flag = true; else break; } } flag = false; for (rx = centers[i].getX(); rx < image.length; rx++) { if (image[rx][y] == QRCodeImageReader.POINT_DARK && image[rx + 1][y] == QRCodeImageReader.POINT_LIGHT) { if (flag == false) flag = true; else break; } } width[i] = (rx - lx + 1); } return width; } static int calcRoughVersion(Point[] center, int[] width) { final int dp = QRCodeImageReader.DECIMAL_POINT; int lengthAdditionalLine = (new Line(center[UL], center[UR]).getLength()) << dp ; int avarageWidth = ((width[UL] + width[UR]) << dp) / 14; int roughVersion = ((lengthAdditionalLine / avarageWidth) - 10) / 4; if (((lengthAdditionalLine / avarageWidth) - 10) % 4 >= 2) { roughVersion++; } return roughVersion; } static int calcExactVersion(Point[] centers, int[] angle, int[] moduleSize, boolean[][] image) throws InvalidVersionInfoException, InvalidVersionException { boolean[] versionInformation = new boolean[18]; Point[] points = new Point[18]; Point target; Axis axis = new Axis(angle, moduleSize[UR]); //UR axis.setOrigin(centers[UR]); for (int y = 0; y < 6; y++) { for (int x = 0; x < 3; x++) { target = axis.translate(x - 7, y - 3); versionInformation[x + y * 3] = image[target.getX()][target.getY()]; points[x + y * 3] = target; } } canvas.drawPoints(points, Color.RED); int exactVersion = 0; try { exactVersion = checkVersionInfo(versionInformation); } catch (InvalidVersionInfoException e) { canvas.println("Version info error. now retry with other place one."); axis.setOrigin(centers[DL]); axis.setModulePitch(moduleSize[DL]); //DL for (int x = 0; x < 6; x++) { for (int y = 0; y < 3; y++) { target = axis.translate(x - 3, y - 7); versionInformation[y + x * 3] = image[target.getX()][target.getY()]; points[x + y * 3] = target; } } canvas.drawPoints(points, Color.RED); try { exactVersion = checkVersionInfo(versionInformation); } catch (VersionInformationException e2) { throw e2; } } return exactVersion; } static int checkVersionInfo(boolean[] target) throws InvalidVersionInfoException{ // note that this method includes BCH 18-6 Error Correction // see page 67 on JIS-X-0510(2004) int errorCount = 0, versionBase; for (versionBase = 0; versionBase < VersionInfoBit.length; versionBase++) { errorCount = 0; for (int j = 0; j < 18; j++) { if (target[j] ^ (VersionInfoBit[versionBase] >> j) % 2 == 1) errorCount++; } if (errorCount <= 3) break; } if (errorCount <= 3) return 7 + versionBase; else throw new InvalidVersionInfoException("Too many errors in version information"); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -