⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 finderpattern.java

📁 qrcode的java开源版本
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		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 + -