intersectionmatrix.cpp

来自「一个很好的vc底层代码」· C++ 代码 · 共 295 行

CPP
295
字号
/********************************************************************** * $Id: IntersectionMatrix.cpp,v 1.11.2.1 2005/05/23 18:41:51 strk Exp $ * * GEOS - Geometry Engine Open Source * http://geos.refractions.net * * Copyright (C) 2001-2002 Vivid Solutions Inc. * * This is free software; you can redistribute and/or modify it under * the terms of the GNU Lesser General Public Licence as published * by the Free Software Foundation.  * See the COPYING file for more information. * ********************************************************************** * $Log: IntersectionMatrix.cpp,v $ * Revision 1.11.2.1  2005/05/23 18:41:51  strk * Replaced sprintf uses with ostringstream * * Revision 1.11  2004/07/02 13:28:26  strk * Fixed all #include lines to reflect headers layout change. * Added client application build tips in README. * * Revision 1.10  2003/11/07 01:23:42  pramsey * Add standard CVS headers licence notices and copyrights to all cpp and h * files. * * **********************************************************************/#include <sstream>#include <geos/geom.h>#include <geos/util.h>namespace geos {IntersectionMatrix::IntersectionMatrix(){	//matrix = new int[3][3];	setAll(Dimension::False);}IntersectionMatrix::IntersectionMatrix(string elements){	//matrix = new int[3][3];	setAll(Dimension::False);    set(elements);}IntersectionMatrix::IntersectionMatrix(const IntersectionMatrix &im){	//matrix = new int[3][3];	setAll(Dimension::False);	matrix[Location::INTERIOR][Location::INTERIOR] = im.matrix[Location::INTERIOR][Location::INTERIOR];	matrix[Location::INTERIOR][Location::BOUNDARY] = im.matrix[Location::INTERIOR][Location::BOUNDARY];	matrix[Location::INTERIOR][Location::EXTERIOR] = im.matrix[Location::INTERIOR][Location::EXTERIOR];	matrix[Location::BOUNDARY][Location::INTERIOR] = im.matrix[Location::BOUNDARY][Location::INTERIOR];	matrix[Location::BOUNDARY][Location::BOUNDARY] = im.matrix[Location::BOUNDARY][Location::BOUNDARY];	matrix[Location::BOUNDARY][Location::EXTERIOR] = im.matrix[Location::BOUNDARY][Location::EXTERIOR];	matrix[Location::EXTERIOR][Location::INTERIOR] = im.matrix[Location::EXTERIOR][Location::INTERIOR];	matrix[Location::EXTERIOR][Location::BOUNDARY] = im.matrix[Location::EXTERIOR][Location::BOUNDARY];	matrix[Location::EXTERIOR][Location::EXTERIOR] = im.matrix[Location::EXTERIOR][Location::EXTERIOR];}IntersectionMatrix::~IntersectionMatrix(){	//delete[] matrix;}/*** Adds one matrix to another.* Addition is defined by taking the maximum dimension value of each position* in the summand matrices.** @param im the matrix to add*/void IntersectionMatrix::add(IntersectionMatrix *im) {	for(int i=0;i<3;i++) {		for(int j=0;j<3;j++) {			setAtLeast(i,j,im->get(i,j));		}	}}bool IntersectionMatrix::matches(int actualDimensionValue, char requiredDimensionSymbol) {	if (requiredDimensionSymbol=='*') {		return true;	}	if (requiredDimensionSymbol=='T' && (actualDimensionValue >= 0 ||										 actualDimensionValue==Dimension::True)) {		return true;	}	if (requiredDimensionSymbol=='F' && actualDimensionValue==Dimension::False) {		return true;	}	if (requiredDimensionSymbol=='0' && actualDimensionValue==Dimension::P) {		return true;	}	if (requiredDimensionSymbol=='1' && actualDimensionValue==Dimension::L) {		return true;	}	if (requiredDimensionSymbol=='2' && actualDimensionValue==Dimension::A) {		return true;	}	return false;}bool IntersectionMatrix::matches(string actualDimensionSymbols, string requiredDimensionSymbols) {	IntersectionMatrix* m=new IntersectionMatrix(actualDimensionSymbols);	bool result=m->matches(requiredDimensionSymbols);	delete m;	return result;}void IntersectionMatrix::set(int row, int column, int dimensionValue){	matrix[row][column] = dimensionValue;}void IntersectionMatrix::set(string dimensionSymbols) {	unsigned int limit;	if ((unsigned int)
		dimensionSymbols.length()<=9) limit=(unsigned int)dimensionSymbols.length();	else 
		limit=9;	for (unsigned int i = 0; i < limit; i++) {		int row = i / 3;		int col = i % 3;		matrix[row][col] = Dimension::toDimensionValue(dimensionSymbols[i]);	}}void IntersectionMatrix::setAtLeast(int row, int column, int minimumDimensionValue) {	if (matrix[row][column] < minimumDimensionValue) {		matrix[row][column] = minimumDimensionValue;	}}void IntersectionMatrix::setAtLeastIfValid(int row, int column, int minimumDimensionValue) {	if (row >= 0 && column >= 0) {		setAtLeast(row, column, minimumDimensionValue);	}}void IntersectionMatrix::setAtLeast(string minimumDimensionSymbols) {	unsigned int limit;	if ((unsigned int)minimumDimensionSymbols.length()<=9)		limit=(unsigned int)minimumDimensionSymbols.length();	else
		limit=9;	for (unsigned int i = 0; i < limit; i++) {		int row = i / 3;		int col = i % 3;		setAtLeast(row, col, Dimension::toDimensionValue(minimumDimensionSymbols[i]));	}}void IntersectionMatrix::setAll(int dimensionValue) {	for (int ai = 0; ai < 3; ai++) {		for (int bi = 0; bi < 3; bi++) {			matrix[ai][bi] = dimensionValue;		}	}}int IntersectionMatrix::get(int row, int column) {	return matrix[row][column];}bool IntersectionMatrix::isDisjoint() {	return matrix[Location::INTERIOR][Location::INTERIOR]==Dimension::False &&		matrix[Location::INTERIOR][Location::BOUNDARY]==Dimension::False &&		matrix[Location::BOUNDARY][Location::INTERIOR]==Dimension::False &&		matrix[Location::BOUNDARY][Location::BOUNDARY]==Dimension::False;}bool IntersectionMatrix::isIntersects() {	return !isDisjoint();}bool IntersectionMatrix::isTouches(int dimensionOfGeometryA, int dimensionOfGeometryB) {	if (dimensionOfGeometryA > dimensionOfGeometryB) {		//no need to get transpose because pattern matrix is symmetrical		return isTouches(dimensionOfGeometryB, dimensionOfGeometryA);	}	if ((dimensionOfGeometryA==Dimension::A && dimensionOfGeometryB==Dimension::A) ||		(dimensionOfGeometryA==Dimension::L && dimensionOfGeometryB==Dimension::L) ||		(dimensionOfGeometryA==Dimension::L && dimensionOfGeometryB==Dimension::A) ||		(dimensionOfGeometryA==Dimension::P && dimensionOfGeometryB==Dimension::A) ||		(dimensionOfGeometryA==Dimension::P && dimensionOfGeometryB==Dimension::L)) {		return matrix[Location::INTERIOR][Location::INTERIOR]==Dimension::False &&			  (matches(matrix[Location::INTERIOR][Location::BOUNDARY], 'T') ||			   matches(matrix[Location::BOUNDARY][Location::INTERIOR], 'T') ||			   matches(matrix[Location::BOUNDARY][Location::BOUNDARY], 'T'));	}	return false;}bool IntersectionMatrix::isCrosses(int dimensionOfGeometryA, int dimensionOfGeometryB) {	if ((dimensionOfGeometryA==Dimension::P && dimensionOfGeometryB==Dimension::L) ||		(dimensionOfGeometryA==Dimension::P && dimensionOfGeometryB==Dimension::A) ||		(dimensionOfGeometryA==Dimension::L && dimensionOfGeometryB==Dimension::A)) {		return matches(matrix[Location::INTERIOR][Location::INTERIOR], 'T') &&			   matches(matrix[Location::INTERIOR][Location::EXTERIOR], 'T');	}	if ((dimensionOfGeometryA==Dimension::L && dimensionOfGeometryB==Dimension::P) ||		(dimensionOfGeometryA==Dimension::A && dimensionOfGeometryB==Dimension::P) ||		(dimensionOfGeometryA==Dimension::A && dimensionOfGeometryB==Dimension::L)) {		return matches(matrix[Location::INTERIOR][Location::INTERIOR], 'T') &&			   matches(matrix[Location::EXTERIOR][Location::INTERIOR], 'T');	}	if (dimensionOfGeometryA==Dimension::L && dimensionOfGeometryB==Dimension::L) {		return matrix[Location::INTERIOR][Location::INTERIOR]==0;	}	return false;}bool IntersectionMatrix::isWithin() {	return matches(matrix[Location::INTERIOR][Location::INTERIOR], 'T') &&		   matrix[Location::INTERIOR][Location::EXTERIOR]==Dimension::False &&		   matrix[Location::BOUNDARY][Location::EXTERIOR]==Dimension::False;}bool IntersectionMatrix::isContains() {	return matches(matrix[Location::INTERIOR][Location::INTERIOR], 'T') &&		   matrix[Location::EXTERIOR][Location::INTERIOR]==Dimension::False &&		   matrix[Location::EXTERIOR][Location::BOUNDARY]==Dimension::False;}bool IntersectionMatrix::isEquals(int dimensionOfGeometryA, int dimensionOfGeometryB) {	if (dimensionOfGeometryA != dimensionOfGeometryB) {		return false;	}	return matches(matrix[Location::INTERIOR][Location::INTERIOR], 'T') &&		   matrix[Location::EXTERIOR][Location::INTERIOR]==Dimension::False &&		   matrix[Location::INTERIOR][Location::EXTERIOR]==Dimension::False &&		   matrix[Location::EXTERIOR][Location::BOUNDARY]==Dimension::False &&		   matrix[Location::BOUNDARY][Location::EXTERIOR]==Dimension::False;}bool IntersectionMatrix::isOverlaps(int dimensionOfGeometryA, int dimensionOfGeometryB) {	if ((dimensionOfGeometryA==Dimension::P && dimensionOfGeometryB==Dimension::P) ||		(dimensionOfGeometryA==Dimension::A && dimensionOfGeometryB==Dimension::A)) {		return matches(matrix[Location::INTERIOR][Location::INTERIOR], 'T') &&			   matches(matrix[Location::INTERIOR][Location::EXTERIOR], 'T') &&			   matches(matrix[Location::EXTERIOR][Location::INTERIOR],'T');	}	if (dimensionOfGeometryA==Dimension::L && dimensionOfGeometryB==Dimension::L) {		return matrix[Location::INTERIOR][Location::INTERIOR]==1 &&			   matches(matrix[Location::INTERIOR][Location::EXTERIOR], 'T') &&			   matches(matrix[Location::EXTERIOR][Location::INTERIOR], 'T');	}	return false;}bool IntersectionMatrix::matches(string requiredDimensionSymbols) {	if (requiredDimensionSymbols.length() != 9) {		ostringstream s;		s<<"IllegalArgumentException: Should be length 9: "<<			requiredDimensionSymbols<<endl;		throw new IllegalArgumentException(s.str());	}	for (int ai = 0; ai < 3; ai++) {		for (int bi = 0; bi < 3; bi++) {			if (!matches(matrix[ai][bi],requiredDimensionSymbols[3*ai+bi])) {				return false;			}		}	}	return true;}//Not sureIntersectionMatrix* IntersectionMatrix::transpose() {	int temp = matrix[1][0];	matrix[1][0] = matrix[0][1];	matrix[0][1] = temp;	temp = matrix[2][0];	matrix[2][0] = matrix[0][2];	matrix[0][2] = temp;	temp = matrix[2][1];	matrix[2][1] = matrix[1][2];	matrix[1][2] = temp;	return this;}string IntersectionMatrix::toString() {	string result("");	for (int ai = 0; ai < 3; ai++) {		for (int bi = 0; bi < 3; bi++) {			result+=Dimension::toDimensionSymbol(matrix[ai][bi]);		}	}	return result;}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?