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

📄 csdareamethod.cpp

📁 能在MDT5/6环境下对已经存在地曲面进行全部和局部区域展开
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					klen = oSurfTrimmedLoops2d[i].at(j).length();
					for (k=klen-1; k>0; k--) {
						if ((oSurfTrimmedLoops2d[i])[j].at(k).isEqualTo(
							(oSurfTrimmedLoops2d[i])[j].at(k-1))) {
							(oSurfTrimmedLoops2d[i])[j].removeAt(k);
						}
					}
					if (oSurfTrimmedLoops2d[i].at(j).length()<2)
						oSurfTrimmedLoops2d[i].removeAt(j);
				}
				if (oSurfTrimmedLoops2d[i].length()<2)
					oSurfTrimmedLoops2d.removeAt(i);
			}*/

		}
	}
	

}

void CSDAreaISO::evalOPnts()
{
	AcGePoint2d param;
	double paramUStep, paramVStep, paramUStart, paramUEnd, paramVStart, paramVEnd, tmp;
	paramUStep = oEvalU.length()/nU;
	paramVStep = oEvalV.length()/nV;
	paramUStart = oEvalU.lowerBound();
	paramVStart = oEvalV.lowerBound();
	paramUEnd = oEvalU.upperBound();
	paramVEnd = oEvalV.upperBound();

	// 判断顶点是否重合
	AcGePoint3d p1,p2,p3,p4;
	p1 = oBaseSurf.evalPoint(param.set(paramUStart,paramVStart));
	p2 = oBaseSurf.evalPoint(param.set(paramUEnd,paramVStart));
	p3 = oBaseSurf.evalPoint(param.set(paramUEnd,paramVEnd));
	p4 = oBaseSurf.evalPoint(param.set(paramUStart,paramVEnd));
	if (p1.isEqualTo(p2)) {
		nSingularity = 1;
		oSingularity = p1;
	} else if (p2.isEqualTo(p3)) {
		nSingularity = 2;
		oSingularity = p2;
	} else if (p3.isEqualTo(p4)) {
		nSingularity = 3;
		oSingularity = p3;
	} else if (p4.isEqualTo(p1)) {
		nSingularity = 4;
		oSingularity = p4;
	} else nSingularity = 0;

	oPntArr.setLogicalLength((nU+1)*(nV+1));
	dPntArr.setLogicalLength((nU+1)*(nV+1));

	int i,j;
	for ( i=0; i<nU+1; i++ ) {
		tmp = paramUStart+i*paramUStep;
		for ( j=0; j<nV+1; j++ ) {
			param.set(tmp, paramVStart+j*paramVStep);
			oPntArr[i*(nV+1)+j] = oBaseSurf.evalPoint(param);
		}
	}

	if (bAutoOCenter) { // 自动计算展开中心
		posCU = Round((nU+1)/2.0)-1;
		posCV = Round((nV+1)/2.0)-1;
		oCenter = oRCenter = oPntArr[posCU*(nV+1)+posCV];
	} else {
		oBaseSurf.isOn(oCenter,param);
		double factor;
		factor = (param.x-paramUStart)/oEvalU.length(); 
		if (factor > 0.75) {
			factor = 0.75;
		} else if (factor < 0.25) {
			factor = 0.25;
		}
		posCU = Round(factor*nU);
		factor = (param.y-paramVStart)/oEvalV.length(); 
		if (factor > 0.75) {
			factor = 0.75;
		} else if (factor < 0.25) {
			factor = 0.25;
		}
		posCV = Round(factor*nV);
		if (posCU==nU) posCU = nU-1;
		if (posCV==nV) posCV = nV-1;

		oRCenter = oPntArr[posCU*(nV+1)+posCV];
	}


	dPntArr[posCU*(nV+1)+posCV] = dCenter;
}



void CSDAreaISO::eval4PntsArdCenter()
{
	pntArr1.setLogicalLength(5);
	pntArr2.setLogicalLength(5);

	pntArr1[0] = oPntArr[posCU*(nV+1)+posCV];
	pntArr1[1] = oPntArr[(posCU+1)*(nV+1)+posCV];
	pntArr1[2] = oPntArr[posCU*(nV+1)+posCV+1];
	pntArr1[3] = oPntArr[(posCU-1)*(nV+1)+posCV];
	pntArr1[4] = oPntArr[posCU*(nV+1)+posCV-1];

	pntArr2[0] = dPntArr[posCU*(nV+1)+posCV];
	centerArounded4Points(pntArr1,pntArr2);
	dPntArr[(posCU+1)*(nV+1)+posCV] = pntArr2[1];
	dPntArr[posCU*(nV+1)+posCV+1] = pntArr2[2];
	dPntArr[(posCU-1)*(nV+1)+posCV] = pntArr2[3];
	dPntArr[posCU*(nV+1)+posCV-1] = pntArr2[4];

}

void CSDAreaISO::evalTol()
{
	double dist,dist1;
	dist = dPntArr[posCU*(nV+1)+posCV].distanceTo(dPntArr[(posCU+1)*(nV+1)+posCV])/nTol;
	dist1 = dPntArr[posCU*(nV+1)+posCV].distanceTo(dPntArr[posCU*(nV+1)+posCV+1])/nTol;
	if(dist > dist1) {	// 得到uv方向两相邻离散点距离的最小值的1/nTol
		dist = dist1;
	}
	dTol = dist;

	dist = oPntArr[posCU*(nV+1)+posCV].distanceTo(oPntArr[(posCU+1)*(nV+1)+posCV])/nTol;
	dist1 = oPntArr[posCU*(nV+1)+posCV].distanceTo(oPntArr[posCU*(nV+1)+posCV+1])/nTol;
	if(dist > dist1) {	// 得到uv方向两相邻离散点距离的最小值的1/nTol
		dist = dist1;
	}

	if (dTol > dist) { // 取上述两者的最小值为误差值
		dTol = dist;
	}
}


void CSDAreaISO::eval1stSecRow()
{
	pntArr1.setLogicalLength(4);
	pntArr2.setLogicalLength(4);

	pntArr1[0] = oPntArr[posCU*(nV+1)+posCV];
	pntArr1[1] = oPntArr[(posCU+1)*(nV+1)+posCV];
	pntArr1[2] = oPntArr[posCU*(nV+1)+posCV+1];
	pntArr1[3] = oPntArr[(posCU+1)*(nV+1)+posCV+1];
	pntArr2[0] = dPntArr[posCU*(nV+1)+posCV];
	pntArr2[1] = dPntArr[(posCU+1)*(nV+1)+posCV];
	pntArr2[2] = dPntArr[posCU*(nV+1)+posCV+1];
	quadrangle4thPoint(pntArr1,pntArr2);
	dPntArr[(posCU+1)*(nV+1)+posCV+1] = pntArr2[3];

	int i;
	for(i=posCU+1;i<nU;i++)
	{
		pntArr1[0] = oPntArr[i*(nV+1)+posCV];
		pntArr1[1] = oPntArr[(i+1)*(nV+1)+posCV];
		pntArr1[2] = oPntArr[i*(nV+1)+posCV+1];
		pntArr1[3] = oPntArr[(i+1)*(nV+1)+posCV+1];
		pntArr2[0] = dPntArr[i*(nV+1)+posCV];
		pntArr2[2] = dPntArr[i*(nV+1)+posCV+1];
		quadrangle3rdPoint(pntArr1,pntArr2);
		dPntArr[(i+1)*(nV+1)+posCV] = pntArr2[1];
		quadrangle4thPoint(pntArr1,pntArr2);
		dPntArr[(i+1)*(nV+1)+posCV+1] = pntArr2[3];	
	}
}

void CSDAreaISO::eval2ndSecCol()
{
	pntArr1.setLogicalLength(4);
	pntArr2.setLogicalLength(4);

	pntArr1[0] = oPntArr[posCU*(nV+1)+posCV];
	pntArr1[1] = oPntArr[posCU*(nV+1)+posCV+1];
	pntArr1[2] = oPntArr[(posCU-1)*(nV+1)+posCV];
	pntArr1[3] = oPntArr[(posCU-1)*(nV+1)+posCV+1];
	pntArr2[0] = dPntArr[posCU*(nV+1)+posCV];
	pntArr2[1] = dPntArr[posCU*(nV+1)+posCV+1];
	pntArr2[2] = dPntArr[(posCU-1)*(nV+1)+posCV];
	quadrangle4thPoint(pntArr1,pntArr2);
	dPntArr[(posCU-1)*(nV+1)+posCV+1] = pntArr2[3];

	int i;
	for(i=posCV+1;i<nV;i++)
	{
		pntArr1[0] = oPntArr[posCU*(nV+1)+i];
		pntArr1[1] = oPntArr[posCU*(nV+1)+i+1];
		pntArr1[2] = oPntArr[(posCU-1)*(nV+1)+i];
		pntArr1[3] = oPntArr[(posCU-1)*(nV+1)+i+1];
		pntArr2[0] = dPntArr[posCU*(nV+1)+i];
		pntArr2[2] = dPntArr[(posCU-1)*(nV+1)+i];
		quadrangle3rdPoint(pntArr1,pntArr2);
		dPntArr[posCU*(nV+1)+i+1] = pntArr2[1];
		quadrangle4thPoint(pntArr1,pntArr2);
		dPntArr[(posCU-1)*(nV+1)+i+1] = pntArr2[3];	
	}
}

void CSDAreaISO::eval3rdSecRow()
{
	pntArr1.setLogicalLength(4);
	pntArr2.setLogicalLength(4);

	pntArr1[0] = oPntArr[posCU*(nV+1)+posCV];
	pntArr1[1] = oPntArr[(posCU-1)*(nV+1)+posCV];
	pntArr1[2] = oPntArr[posCU*(nV+1)+posCV-1];
	pntArr1[3] = oPntArr[(posCU-1)*(nV+1)+posCV-1];
	pntArr2[0] = dPntArr[posCU*(nV+1)+posCV];
	pntArr2[1] = dPntArr[(posCU-1)*(nV+1)+posCV];
	pntArr2[2] = dPntArr[posCU*(nV+1)+posCV-1];
	quadrangle4thPoint(pntArr1,pntArr2);
	dPntArr[(posCU-1)*(nV+1)+posCV-1] = pntArr2[3];

	int i;
	for(i=posCU-1;i>0;i--)
	{
		pntArr1[0] = oPntArr[i*(nV+1)+posCV];
		pntArr1[1] = oPntArr[(i-1)*(nV+1)+posCV];
		pntArr1[2] = oPntArr[i*(nV+1)+posCV-1];
		pntArr1[3] = oPntArr[(i-1)*(nV+1)+posCV-1];
		pntArr2[0] = dPntArr[i*(nV+1)+posCV];
		pntArr2[2] = dPntArr[i*(nV+1)+posCV-1];
		quadrangle3rdPoint(pntArr1,pntArr2);
		dPntArr[(i-1)*(nV+1)+posCV] = pntArr2[1];
		quadrangle4thPoint(pntArr1,pntArr2);
		dPntArr[(i-1)*(nV+1)+posCV-1] = pntArr2[3];	
	}
}

void CSDAreaISO::eval4thSecCol()
{
	pntArr1.setLogicalLength(4);
	pntArr2.setLogicalLength(4);

	pntArr1[0] = oPntArr[posCU*(nV+1)+posCV];
	pntArr1[1] = oPntArr[posCU*(nV+1)+posCV-1];
	pntArr1[2] = oPntArr[(posCU+1)*(nV+1)+posCV];
	pntArr1[3] = oPntArr[(posCU+1)*(nV+1)+posCV-1];
	pntArr2[0] = dPntArr[posCU*(nV+1)+posCV];
	pntArr2[1] = dPntArr[posCU*(nV+1)+posCV-1];
	pntArr2[2] = dPntArr[(posCU+1)*(nV+1)+posCV];
	quadrangle4thPoint(pntArr1,pntArr2);
	dPntArr[(posCU+1)*(nV+1)+posCV-1] = pntArr2[3];

	int i;
	for(i=posCV-1;i>0;i--)
	{
		pntArr1[0] = oPntArr[posCU*(nV+1)+i];
		pntArr1[1] = oPntArr[posCU*(nV+1)+i-1];
		pntArr1[2] = oPntArr[(posCU+1)*(nV+1)+i];
		pntArr1[3] = oPntArr[(posCU+1)*(nV+1)+i-1];
		pntArr2[0] = dPntArr[posCU*(nV+1)+i];
		pntArr2[2] = dPntArr[(posCU+1)*(nV+1)+i];
		quadrangle3rdPoint(pntArr1,pntArr2);
		dPntArr[posCU*(nV+1)+i-1] = pntArr2[1];
		quadrangle4thPoint(pntArr1,pntArr2);
		dPntArr[(posCU+1)*(nV+1)+i-1] = pntArr2[3];	
	}
}

void CSDAreaISO::eval1stSecOth()
{
	pntArr1.setLogicalLength(4);
	pntArr2.setLogicalLength(4);

	int i,j;
	for(i=posCU;i<nU;i++) {
		for(j=posCV+1;j<nV;j++) {
			pntArr1[0] = oPntArr[i*(nV+1)+j];
			pntArr1[1] = oPntArr[(i+1)*(nV+1)+j];
			pntArr1[2] = oPntArr[i*(nV+1)+j+1];
			pntArr1[3] = oPntArr[(i+1)*(nV+1)+j+1];
			pntArr2[0] = dPntArr[i*(nV+1)+j];
			pntArr2[1] = dPntArr[(i+1)*(nV+1)+j];
			pntArr2[2] = dPntArr[i*(nV+1)+j+1];
			quadrangle4thPoint(pntArr1,pntArr2);
			dPntArr[(i+1)*(nV+1)+j+1] = pntArr2[3];	
		}
	}
}

void CSDAreaISO::eval2ndSecOth()
{
	pntArr1.setLogicalLength(4);
	pntArr2.setLogicalLength(4);

	int i,j;
	for(j=posCV;j<nV;j++) {
		for(i=posCU-1;i>0;i--) {
			pntArr1[0] = oPntArr[i*(nV+1)+j];
			pntArr1[1] = oPntArr[i*(nV+1)+j+1];
			pntArr1[2] = oPntArr[(i-1)*(nV+1)+j];
			pntArr1[3] = oPntArr[(i-1)*(nV+1)+j+1];
			pntArr2[0] = dPntArr[i*(nV+1)+j];
			pntArr2[1] = dPntArr[i*(nV+1)+j+1];
			pntArr2[2] = dPntArr[(i-1)*(nV+1)+j];
			quadrangle4thPoint(pntArr1,pntArr2);
			dPntArr[(i-1)*(nV+1)+j+1] = pntArr2[3];	
		}
	}
}

void CSDAreaISO::eval3rdSecOth()
{
	pntArr1.setLogicalLength(4);
	pntArr2.setLogicalLength(4);

	int i,j;
	for(i=posCU;i>0;i--) {
		for(j=posCV-1;j>0;j--) {
			pntArr1[0] = oPntArr[i*(nV+1)+j];
			pntArr1[1] = oPntArr[(i-1)*(nV+1)+j];
			pntArr1[2] = oPntArr[i*(nV+1)+j-1];
			pntArr1[3] = oPntArr[(i-1)*(nV+1)+j-1];
			pntArr2[0] = dPntArr[i*(nV+1)+j];
			pntArr2[1] = dPntArr[(i-1)*(nV+1)+j];
			pntArr2[2] = dPntArr[i*(nV+1)+j-1];
			quadrangle4thPoint(pntArr1,pntArr2);
			dPntArr[(i-1)*(nV+1)+j-1] = pntArr2[3];	
		}
	}
}


void CSDAreaISO::eval4thSecOth()
{
	pntArr1.setLogicalLength(4);
	pntArr2.setLogicalLength(4);

	int i,j;
	for(j=posCV;j>0;j--) {
		for(i=posCU+1;i<nU;i++) {
			pntArr1[0] = oPntArr[i*(nV+1)+j];
			pntArr1[1] = oPntArr[i*(nV+1)+j-1];
			pntArr1[2] = oPntArr[(i+1)*(nV+1)+j];
			pntArr1[3] = oPntArr[(i+1)*(nV+1)+j-1];
			pntArr2[0] = dPntArr[i*(nV+1)+j];
			pntArr2[1] = dPntArr[i*(nV+1)+j-1];
			pntArr2[2] = dPntArr[(i+1)*(nV+1)+j];
			quadrangle4thPoint(pntArr1,pntArr2);
			dPntArr[(i+1)*(nV+1)+j-1] = pntArr2[3];	
		}
	}
}

void CSDAreaISO::evalDPnts()
{
	dRCenter = dCenter;
	mapPointToD(oCenter,dCenter);
	AcGeVector2d vec;	
	vec = dRCenter-dCenter;
	for(int i=0;i<dPntArr.length();i++) {
		dPntArr[i] = dPntArr[i]+vec;
	}
	dRCenter = dRCenter+vec;
	dCenter = dCenter+vec;

	// 重新计算二维重合点
	if (nSingularity) {
		dSingularity = dSingularity+vec;
	}

	AcGePoint2d tmpPnt;
	mapPointToD(oCenter,tmpPnt);
}

bool CSDAreaISO::isOnOBaseSurf(const AcGePoint3d& op) const
{

	if(oBaseSurf.distanceTo(op)>dTol) 
		return false;	// 点在曲面外

	return true;
}

bool CSDAreaISO::isDefined(void) const
{
	if (oSurfLoops.length()) {
		return true;
	} else {
		return false;
	}
}


bool CSDAreaISO::isOnDBaseSurf(const AcGePoint3d& dp) const
{
	if(dBaseSurf.distanceTo(dp)>dTol) 
		return false;	// 点在曲面外

	return true;
}

bool CSDAreaISO::isOnDBaseSurf(const AcGePoint2d& dp) const
{
	AcGePoint3d dp3d(dp.x,dp.y,dCenterZ);

	return isOnDBaseSurf(dp3d);
}

/*
bool CSDAreaISO::isReversed()
{
	return bIsReversed;
}*/




void CSDAreaISO::eval()
{		
	evalPnts(); 
	genDSurf();
}

bool CSDAreaISO::mapPointToD(const AcGePoint3d& op,AcGePoint3d& dp)
{
	AcGePoint2d dp2d;
	bool ret;

	ret = mapPointToD(op,dp2d);
	if(ret) {
		dp = AcGePoint3d(dp2d.x,dp2d.y,dCenterZ);
	}

	return ret;
}

// 映射左下三角形内的点到展开平面
bool CSDAreaISO::mapLeftBottToD(int posu,int posv, const AcGePoint3d& op, AcGePoint2d& dp)
{
	AcGePoint3dArray pnts1;
	AcGePoint2dArray pnts2d1,mpnts1;
	AcGePlane pln1;
	bool bMapped=false;

	pnts1.setLogicalLength(3);
	pnts2d1.setLogicalLength(4);
	mpnts1.setLogicalLength(4);

	int i,j;
	i = posu;
	j = posv;

	// 由P(i,j)P(i+1,j)P(i,j+1)三点组成的空间三角形pnts,转换成平面三角形pnts1
	pnts1[0] = oPntArr[i*(nV+1)+j];
	pnts1[1] = oPntArr[(i+1)*(nV+1)+j];
	pnts1[2] = oPntArr[i*(nV+1)+j+1];
	
	getPlaneFrom3Pnts(pnts1,pln1); // 得到平面
	pnts2d1[0] = pnts1[0].convert2d(pln1);
	pnts2d1[1] = pnts1[1].convert2d(pln1);

⌨️ 快捷键说明

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