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

📄 cvector.cpp

📁 GPS坐标转换软件与源程序 支持世界上大多数坐标框架下
💻 CPP
字号:
// CVector.cpp: implementation of the CVector class.
//
//////////////////////////////////////////////////////////////////////


#include "stdafx.h"
#include "CVector.h"
#include <math.h>

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CVector::CVector()
{
	//在执行本函数体之前,要执行基类CMatrix的默认构造函数CMatrix()
}

//初始化
CVector::CVector(const CMatrix& OriginalMatrix)
{
	//在执行本函数体之前,要执行基类CMatrix的默认构造函数CMatrix()
	InitMatrix(OriginalMatrix.GetDataAddress(), OriginalMatrix.GetRowNumber(), 1);
}

//初始化
CVector::CVector(const CVector& OriginalVector)
{
	//在执行本函数体之前,要执行基类CMatrix的默认构造函数CMatrix()
	InitMatrix(OriginalVector.GetDataAddress(), OriginalVector.GetRowNumber(), 1);
}

/*功能:初始化
//参数:
      pData 数据地址
	  nElementNum 矢量数组长*/
CVector::CVector(const f8 *pData, i4 nElementNum)
{
	InitMatrix(pData,nElementNum,1);
}

/*功能:初始化
//参数:
      pData 数据地址
	  nElementNum 矢量数组长*/
i4 CVector::InitVector(const f8 *pData, i4 nElementNum)
{
	return InitMatrix(pData,nElementNum,1);
}

CVector::~CVector()
{

}

//////////////////////////////////////////////////////////////////////////
// Implementations
//////////////////////////////////////////////////////////////////////

//功能:矢量叉积
//参数:veRight	被叉积的矢量
//返回:矢量叉积结果矢量
CVector CVector::VectorMulti(const CVector &veRight)
{
	CMatrix maAntisym = this->GetAntisymmetricMatrix();
	CVector veResult = maAntisym * veRight;

	return veResult;
}

//功能:矢量点积
//参数:veRight	被点积的矢量
//返回:矢量点积结果标量
f8 CVector::ScalarMulti(const CVector &veRight)
{
	CMatrix maMultiResult = this->GetTransposedMatrix() * veRight;//在C++语言中,派生类对象可以当作基类对象直接使用,不必进行转换
	f8 dData; maMultiResult.GetData(&dData);
	return dData;
}

//功能:计算三维向量相对应的反对称矩阵
//参数:无
//返回:三维反对称矩阵
CMatrix CVector::GetAntisymmetricMatrix()
{
	CMatrix maAntisym;
	if(this->m_nRowNumber != 3) return maAntisym;
	f8 pdAntisym[9] = { 0,				- *(m_pData+2),	*(m_pData+1),
						*(m_pData+2),	0,				- *(m_pData+0),
						- *(m_pData+1),	*(m_pData+0),	0			};
	maAntisym.InitMatrix(pdAntisym,3,3);
	return maAntisym;
}


//功能:获取矢量子量
//参数:
//		vePart:		矢量部分结果
//		nStart:	开始位置,从0起算
//		nLength:	子向量长度
//返回:成功1;失败0
i4 CVector::GetSubVector(CVector& vePart, i4 nStart, i4 nLength)const
{
	if(nLength == 0 || nLength>m_nRowNumber) return 0;
	vePart.InitVector(m_pData+nStart, nLength);

	return 1;
}


//功能:获取矢量子量
//参数:
//		nStart:	开始位置,从0起算
//		nLength:	子向量长度
//返回:矢量部分结果
CVector CVector::GetSubVector(i4 nStart, i4 nLength)const
{
	CVector veRes;
	this->GetSubVector(veRes, nStart, nLength);

	return veRes;
}


//功能:获取矢量长度
//参数:无
//返回:矢量长度
f8 CVector::GetLength()
{
	f8 f8Length = 0;
	for (i4 i=0; i<m_nRowNumber; i++)
	{
		f8Length += m_pData[i] * m_pData[i];
	}
	f8Length = sqrt(f8Length);
	
	return f8Length;
}

f8 CVector::GetLength(i4 n)
{
	if (n > m_nRowNumber) 
		return -1.0;
	f8 f8Length = 0;
	for (i4 i=0; i<n; i++)
	{
		f8Length += m_pData[i] * m_pData[i];
	}
	f8Length = sqrt(f8Length);
	
	return f8Length;
}

//功能:赋值操作符重载
/*参数:SecMatrix:		源矩阵,也可以是向量
返回值:自身矢量的引用,这样可以使用连等形式,如: A = B = C ,此时 A , B 都等于 C 的值;
实现方法:调用InitMatrix()函数实现功能
使用示例:A=B=C 意为: B=C; A=B; */
CVector& CVector::operator= (const CMatrix & SecMatrix)
{
	if(&SecMatrix == this) return *this;
	this->InitMatrix(SecMatrix.GetDataAddress(),SecMatrix.GetRowNumber(),1);

	return *this;
}
//[] overloading
f8 CVector::operator [](const i4 pos)const
{
	ASSERT(pos>=0 && pos < m_nRowNumber);
	return *(m_pData+ pos);
}

//- overloading
// CVector CVector::operator- (const f8 array[])const
// {
// 	CVector SecTmpVec;
// 	SecTmpVec.InitVector(array,m_nRowNumber);
// 	return (*this-SecTmpVec);
// }
// 
// //- overloading
// CVector CVector::operator- (const CMatrix matrix)const
// {
// 	ASSERT(matrix.GetColumnNumber() ==1);
// 	ASSERT(matrix.GetRowNumber() ==m_nRowNumber);
// 	CVector tmpVec;
// 	
// 	return tmpVec;	
// }
//print to file
i4 CVector::PrintFile(FILE& fp)
{
	for (i4 row=0;row<m_nRowNumber;row++)
	{
		f8 data=*(m_pData+ row);
		if ((fabs(data)>0.001 && data <1e7 && data >-1e7) || fabs(data) <1e-10)
			fprintf(&fp,"%12.3f,",data);
		else if(data<-1e7)
		{
			//modify the index digit to 2;
			int     decimal,   sign;	//decimal point position and sign.
			char    *buffer;			//store string
			char	csign;
			int     precision = 3;		//Number of digits stored
			buffer = _ecvt( data, precision, &decimal, &sign );
			sign == 0 ?csign=' ':csign='-';
			fprintf(&fp,"%c%c.%se%d,",csign,buffer[0],buffer+1,decimal-1);

		}
 		else if(data>1e7)
 		{
			//modify the index digit to 2;
			int     decimal,   sign;	//decimal point position and sign.
			char    *buffer;			//store string
			char	csign;
			int     precision = 4;		//Number of digits stored
			buffer = _ecvt( data, precision, &decimal, &sign );
			sign == 0 ?csign=' ':csign='-';
			fprintf(&fp," %c%c.%se%d,",csign,buffer[0],buffer+1,decimal-1);

 		}
		else
		{
			//modify the index digit to 2;
			int     decimal,   sign;	//decimal point position and sign.
			char    *buffer;			//store string
			char	csign;
			int     precision = 4;		//Number of digits stored
			buffer = _ecvt( data, precision, &decimal, &sign );
			sign == 0 ?csign=' ':csign='-';
			decimal<0 ? fprintf(&fp,"%c%c.%se%d,",csign,buffer[0],buffer+1,decimal-1):
						fprintf(&fp," %c%c.%se%d,",csign,buffer[0],buffer+1,decimal-1);
		}
	}
	fprintf(&fp,"\n");
	return 1;

}

⌨️ 快捷键说明

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