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

📄 connectivity.cpp

📁 一个通过矩阵运算得到图形连接关系的动态连接库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					if(*(*(pMatrixLocal+i)+k) ==1 && *(*(pMatrixLocal+j)+k) == 1)
					{
						bConnect = true;
						bFlag = true;
						*(*(pMatrixLocal+j)+g_netModel.nNodeSum) = -1;
						for(k=0; k<g_netModel.nNodeSum; k++)//for(k=0; k<nLocalCount; k++)
						{
							if(*(*(pMatrixLocal+j)+k) == 1)
								*(*(pMatrixLocal+i)+k) = 1;
							//*(*(pMatrixLocal+i)+k) = *(*(pMatrixLocal+i)+k) || *(*(pMatrixLocal+j)+k);
						}
						break;
					}	
				}
			}
			if(!bFlag) break;
		}
		
		if(*(*(pMatrixLocal+i)+g_netModel.nNodeSum) == 0)
			*(*(pMatrixLocal+i)+g_netModel.nNodeSum) = 10000+i;
		if(bConnect)
		{
			for(j=i+1; j<nLocalCount; j++)//拷贝
			{
				if(*(*(pMatrixLocal+j)+g_netModel.nNodeSum) == -1)
				{
					memcpy(*(pMatrixLocal+j),*(pMatrixLocal+i),sizeof(int)*(g_netModel.nNodeSum+2));
					*(*(pMatrixLocal+j)+g_netModel.nNodeSum) = 10000+i;
				}
			}
		}
	}

	/*for(i=0; i<nLocalCount; i++)
	{
		for(int j=i+1; j<nLocalCount; j++)
		{	
			if(*(*(pMatrixLocal+j)+g_netModel.nNodeSum) == -1) continue;//如第j行与第i行已经线性相关并待进一步处理则返回继续
			else if(*(*(pMatrixLocal+j)+g_netModel.nNodeSum) == 10000+i)//第j行与第i行在0~i-1行的分析过程中已经确定线性相关了,则赋待处理标志
			{
				*(*(pMatrixLocal+j)+g_netModel.nNodeSum) = -1;
				continue;
			}
			else
			{
				//判断第i行第j行是否线性相关
				BOOL bConnect = FALSE;
				for(int k=0; k<g_netModel.nNodeSum; k++)
				{
					if(*(*(pMatrixLocal+i)+k) == 1 && *(*(pMatrixLocal+j)+k) == 1)
					{
						for(k=0; k<g_netModel.nNodeSum; k++)
						{
							if(*(*(pMatrixLocal+i)+k) == 1 || *(*(pMatrixLocal+j)+k) == 1)
								*(*(pMatrixLocal+i)+k) = 1;
						}
						bConnect = TRUE;
						break;
					}
				}
				if(bConnect)
				{
					if(*(*(pMatrixLocal+j)+g_netModel.nNodeSum) != 0)
					{
						//若第j行的线性相关标志不为0,表明还有很多行与其相关,即这些行也与第i行线性相关,即赋待处理标志
						for(k=0; k<i; k++)
						{
							if(*(*(pMatrixLocal+k)+g_netModel.nNodeSum) == *(*(pMatrixLocal+j)+g_netModel.nNodeSum))
								*(*(pMatrixLocal+k)+g_netModel.nNodeSum) = -1;
						}
					}
					*(*(pMatrixLocal+j)+g_netModel.nNodeSum) = -1;
				}
			}
		}
		if(*(*(pMatrixLocal+i)+g_netModel.nNodeSum) == 0)
			*(*(pMatrixLocal+i)+g_netModel.nNodeSum) = 10000+i;
		for(j=0; j<nLocalCount; j++)
		{
			if(*(*(pMatrixLocal+j)+g_netModel.nNodeSum) == -1)
				memcpy(*(pMatrixLocal+j),*(pMatrixLocal+i),sizeof(int)*(g_netModel.nNodeSum+2));
		}
	}*/

	//循环节点确定每一子集的源计数,由于网络中源节点通常比较少,因此以它作为主循环因子
	for(i=0; i<g_netModel.nNodeSum; i++)
	{
		if((g_netModel.pNodeInfo+i)->nPower >= 1)
		{
			//查看局部矩阵所有行,只要该行包含了该源节点,则记入该行的源计数
			for(int j=0; j<nLocalCount; j++)
				if(*(*(pMatrixLocal+j)+i) == 1)
					*(*(pMatrixLocal+j)+(g_netModel.nNodeSum+1)) += (g_netModel.pNodeInfo+i)->nPower;
		}
	}
	//如果初始源计数大于等于1,则更新连通子集拓扑着色
	if(nPower >= 1)
	{
		CIntArray subsetArray;
		for(i=0; i<nLocalCount; i++)
		{
			if(*(*(pMatrixLocal+i)+g_netModel.nNodeSum+1) <= 0)
			{
				BOOL bFind = FALSE;
				for(int j=0; j<subsetArray.GetSize(); j++)
				{
					if(subsetArray[j] == *(*(pMatrixLocal+i)+g_netModel.nNodeSum))
					{
						bFind = TRUE;
						break;
					}
				}
				if(!bFind)
				{
					subsetArray.Add(*(*(pMatrixLocal+i)+g_netModel.nNodeSum));
					//刷新连通子集*(pMatrixLocal+i)拓扑着色为无源
					RefreshSubsetPower(*(pMatrixLocal+i),0);
				}
			}
		}
		RefreshComponentPower(pComponent,0);
	}

	//把计算后的局部矩阵拷贝到当前矩阵中
	//--首先获取当前矩阵中子集标志ID序列
	CIntArray flagArrayCurrent;
	for(i=0; i<g_netModel.nNodeSum; i++)
	{
		BOOL bFind = FALSE;
		for(int j=0; j<flagArrayCurrent.GetSize(); j++)
		{
			if(*(*(g_pMatrixNodeCurrent+i)+g_netModel.nNodeSum) == flagArrayCurrent[j])
			{
				bFind = TRUE;
				break;
			}
		}
		if(!bFind) flagArrayCurrent.Add(*(*(g_pMatrixNodeCurrent+i)+g_netModel.nNodeSum));
	}
	//--获取局部矩阵中子集标志ID序列
	CIntArray flagArrayLocal;
	for(i=0; i<nLocalCount; i++)
	{
		BOOL bFind = FALSE;
		for(int j=0; j<flagArrayLocal.GetSize(); j++)
		{
			if(*(*(pMatrixLocal+i)+g_netModel.nNodeSum) == flagArrayLocal[j])
			{
				bFind = TRUE;
				break;
			}
		}
		if(!bFind) flagArrayLocal.Add(*(*(pMatrixLocal+i)+g_netModel.nNodeSum));
	}
	//--由当前矩阵的ID序列集中获取可用的ID
	int nValue = 100;
	CIntArray flagArrayNew;
	flagArrayNew.Copy(flagArrayLocal);
	for(i=0; i<flagArrayNew.GetSize(); i++)
	{
		while(1)
		{
			nValue ++;
			BOOL bFind = FALSE;
			for(int j=0; j<flagArrayCurrent.GetSize(); j++)
			{
				if(flagArrayCurrent[j] == nValue)
				{
					bFind = TRUE;
					break;
				}
			}
			if(!bFind)
			{
				flagArrayNew.SetAt(i,nValue);
				break;
			}
		}
	}
	//--把局部矩阵的子集标志ID设置为容错的子集标志ID
	//--此处的新的子集ID不会与原有的子集ID出现冲突,因为局部矩阵的计算采用的是10000为基点
	for(i=0; i<flagArrayLocal.GetSize(); i++)
		for(int j=0; j<nLocalCount; j++)
			if(*(*(pMatrixLocal+j)+g_netModel.nNodeSum) == flagArrayLocal[i])
				*(*(pMatrixLocal+j)+g_netModel.nNodeSum) = flagArrayNew[i];
	//--完成拷贝
	for(i=0; i<nLocalCount; i++)
		memcpy(*(g_pMatrixNodeCurrent+nodeArray[i]),*(pMatrixLocal+i),sizeof(int)*(g_netModel.nNodeSum+2));
	//--清除临时内存空间
	//for(i=0; i<nLocalCount; i++)
	//	delete *(pMatrixLocal+i);
	//delete pMatrixLocal;
}
//由元件状态更新节点矩阵
void RefreshCurrentNodeMatrixByState(AV_COMPONENT_INFO* pComponent,BOOL bUpdateNodeMatrix)
{
	//单端元件不作处理
	if(pComponent->nPortSum <= 1) return;

	//更新节点原始联络描述信息
	int nValue = 0;
	if(pComponent->nState == 1) nValue = 1;
	for(int i=0; i<pComponent->nPortSum; i++)
	{
		if((pComponent->pPortInfo+i)->nType == PORT_TYPE_SINGLE) continue;
		int nNodeRef = (pComponent->pPortInfo+i)->nNode;
		if(nNodeRef < 0 || nNodeRef >= g_netModel.nNodeSum) continue;
		for(int j=i+1; j<pComponent->nPortSum; j++)
		{
			if((pComponent->pPortInfo+j)->nType == PORT_TYPE_SINGLE) continue;
			int nNodeTag = (pComponent->pPortInfo+j)->nNode;
			if(nNodeTag < 0 || nNodeTag >= g_netModel.nNodeSum) continue;
			g_pMatrixNodeOrigin[nNodeRef][nNodeTag] = nValue;
			g_pMatrixNodeOrigin[nNodeTag][nNodeRef] = nValue;
		}
	}

	//更新当前分析用节点矩阵
	if(bUpdateNodeMatrix)
	{
		if(nValue == 1) UnionConnectiveSubsetByComponent(pComponent);
		else BreakConnectiveSubsetByComponent(pComponent);
	}
}
//由元件源属性的变化更新节点矩阵的源计数
void RefreshCurrentNodeMatrixByPower(AV_COMPONENT_INFO* pComponent,BOOL bUpdateNodeMatrix)
{
	for(int i=0; i<pComponent->nPortSum; i++)
	{
		//如果该端子是独立端子则不进行拓扑着色的源计数(2003.09.02 for yongjinx as single port with power component)
		if((pComponent->pPortInfo+i)->nType == PORT_TYPE_SINGLE) continue;

		//容错性检验
		int nNodeRef = (pComponent->pPortInfo+i)->nNode;
		if(nNodeRef < 0 || nNodeRef >= g_netModel.nNodeSum) continue;

		//首先更新节点的电源计数
		if(pComponent->nPower == 1)
		{
			(g_netModel.pNodeInfo+nNodeRef)->nPower ++;
			if((g_netModel.pNodeInfo+nNodeRef)->nPower < 1)
				(g_netModel.pNodeInfo+nNodeRef)->nPower = 1;
		}
		else if(pComponent->nPower == 0)
		{
			(g_netModel.pNodeInfo+nNodeRef)->nPower --;
			if((g_netModel.pNodeInfo+nNodeRef)->nPower < 0)
				(g_netModel.pNodeInfo+nNodeRef)->nPower = 0;
		}

		//按要求更新当前节点矩阵
		if(bUpdateNodeMatrix)
		{
			CIntArray subsetArray;
			for(int j=0; j<g_netModel.nNodeSum; j++)
			{
				//判断第j行所在连通子集是否包含节点nNodeRef
				if(*(*(g_pMatrixNodeCurrent+j)+nNodeRef) == 1)
				{
					BOOL bFind = FALSE;
					for(int k=0; k<subsetArray.GetSize(); k++)
					{
						if(subsetArray[k] == *(*(g_pMatrixNodeCurrent+j)+g_netModel.nNodeSum))
						{
							bFind = TRUE;
							break;
						}
					}
					if(!bFind) subsetArray.Add(*(*(g_pMatrixNodeCurrent+j)+g_netModel.nNodeSum));

					if(pComponent->nPower == 1)
					{
						if(*(*(g_pMatrixNodeCurrent+j)+(g_netModel.nNodeSum+1)) <= 0)
						{
							*(*(g_pMatrixNodeCurrent+j)+(g_netModel.nNodeSum+1)) = 1;
							if(!bFind)
							{
								//更新连通子集g_pMatrixNodeCurrent[j]拓扑着色为有源
								RefreshSubsetPower(*(g_pMatrixNodeCurrent+j),1);
							}
						}
						else (*(*(g_pMatrixNodeCurrent+j)+(g_netModel.nNodeSum+1))) ++;
					}
					else if(pComponent->nPower == 0)
					{
						if(*(*(g_pMatrixNodeCurrent+j)+(g_netModel.nNodeSum+1)) <= 0)
							*(*(g_pMatrixNodeCurrent+j)+(g_netModel.nNodeSum+1)) = 0;
						else
						{
							(*(*(g_pMatrixNodeCurrent+j)+(g_netModel.nNodeSum+1))) --;
							if(*(*(g_pMatrixNodeCurrent+j)+(g_netModel.nNodeSum+1)) == 0 && !bFind)
							{
								//更新连通子集g_pMatrixNodeCurrent[j]拓扑着色为无源
								RefreshSubsetPower(*(g_pMatrixNodeCurrent+j),0);
							}
						}
					}
				}
			}
		}
	}
}
/////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////对外接口函数/////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
/*****************************************************************************
【函数名称】       AVMakeNodeMatrix()
【函数功能】       创建节点原始连通矩阵以及前后两个节点连通性分析矩阵并初始化数据
【输入参数】	   无
【输出参数】	   无
*****************************************************************************/
AV_EXPORT USHORT AVMakeNodeMatrix()
{
	if(g_netModel.nNodeSum == 0 || g_netModel.pNodeInfo == NULL) return AVERR_NOT_FOUND;

	//清除可能存在的节点矩阵(原始矩阵、前一矩阵、当前矩阵)
	if(g_pMatrixNodeOrigin)
	{
		for(int i=0; i<g_netModel.nNodeSum; i++)
		{
			delete *(g_pMatrixNodeOrigin+i);
		}
		delete g_pMatrixNodeOrigin;
		g_pMatrixNodeOrigin = NULL;
	}
	if(g_pMatrixNodePrev)
	{
		for(int i=0; i<g_netModel.nNodeSum; i++)
		{
			delete *(g_pMatrixNodePrev+i);
		}
		delete g_pMatrixNodePrev;
		g_pMatrixNodePrev = NULL;
	}
	if(g_pMatrixNodeCurrent)
	{
		for(int i=0; i<g_netModel.nNodeSum; i++)
		{
			delete *(g_pMatrixNodeCurrent+i);
		}
		delete g_pMatrixNodeCurrent;
		g_pMatrixNodeCurrent = NULL;
	}
	if(pMatrixLocal)
	{
		for(int i=0; i<g_netModel.nNodeSum; i++)
		{
			delete *(pMatrixLocal+i);
		}
		delete pMatrixLocal;
		pMatrixLocal = NULL;
	}

	//分配节点矩阵空间并初始化(原始矩阵、前一矩阵、当前矩阵)
	g_pMatrixNodeOrigin = new int*[g_netModel.nNodeSum];
	for(int i=0; i<g_netModel.nNodeSum; i++)
	{
		*(g_pMatrixNodeOrigin+i) = new int[g_netModel.nNodeSum+2];
		memset(*(g_pMatrixNodeOrigin+i),0,sizeof(int)*(g_netModel.nNodeSum+2));
		*(*(g_pMatrixNodeOrigin+i)+i) = 1;
	}
	g_pMatrixNodePrev = new int*[g_netModel.nNodeSum];
	for(i=0; i<g_netModel.nNodeSum; i++)
	{
		*(g_pMatrixNodePrev+i) = new int[g_netModel.nNodeSum+2];
		memset(*(g_pMatrixNodePrev+i),0,sizeof(int)*(g_netModel.nNodeSum+2));
		*(*(g_pMatrixNodePrev+i)+i) = 1;
	}
	g_pMatrixNodeCurrent = new int*[g_netModel.nNodeSum];
	for(i=0; i<g_netModel.nNodeSum; i++)
	{
		*(g_pMatrixNodeCurrent+i) = new int[g_netModel.nNodeSum+2];
		memset(*(g_pMatrixNodeCurrent+i),0,sizeof(int)*(g_netModel.nNodeSum+2));
		*(*(g_pMatrixNodeCurrent+i)+i) = 1;
	}
	pMatrixLocal = new int*[g_netModel.nNodeSum];

⌨️ 快捷键说明

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