📄 csdareamethod.cpp
字号:
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 + -