📄 mgcbeziertriangle3g.cpp
字号:
akXu[uiI01] = 0.5*(akXu[rkBP.m_uiI0] + akXu[rkBP.m_uiI1] -
fDSqr*rkBP.m_kXuuu);
akXv[uiI01] = 0.5*(akXv[rkBP.m_uiI0] + akXv[rkBP.m_uiI1] -
fDSqr*rkBP.m_kXuuv);
// left v-edge subdivision
akXu[uiI02] = 0.5*(akXu[rkBP.m_uiI0] + akXu[rkBP.m_uiI2] -
fDSqr*rkBP.m_kXuvv);
akXv[uiI02] = 0.5*(akXv[rkBP.m_uiI0] + akXv[rkBP.m_uiI2] -
fDSqr*rkBP.m_kXvvv);
// hypotenuse edge subdivision
akXu[uiI12] = 0.5*(akXu[rkBP.m_uiI1] + akXu[rkBP.m_uiI2] -
fDSqr*rkBP.m_kXhhu);
akXv[uiI12] = 0.5*(akXv[rkBP.m_uiI1] + akXv[rkBP.m_uiI2] -
fDSqr*rkBP.m_kXhhv);
}
// recurse on four children
if ( uiLevel > 0 )
{
uiLevel--;
fDSqr *= 0.25;
BlockParameters kSubBP;
// subtriangle <(s0,t0),(sm,t0),(s0,tm)>
kSubBP.m_uiI0 = rkBP.m_uiI0;
kSubBP.m_uiI1 = uiI01;
kSubBP.m_uiI2 = uiI02;
kSubBP.m_aakXuu[0] = rkBP.m_aakXuu[0];
kSubBP.m_aakXuu[1] = kXuu01;
kSubBP.m_aakXuu[2] = kXuu02;
kSubBP.m_aakXvv[0] = rkBP.m_aakXvv[0];
kSubBP.m_aakXvv[1] = kXvv01;
kSubBP.m_aakXvv[2] = kXvv02;
kSubBP.m_aakXhh[0] = rkBP.m_aakXhh[0];
kSubBP.m_aakXhh[1] = kXhh01;
kSubBP.m_aakXhh[2] = kXhh02;
SubdivideLL(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);
// subtriangle <(sm,t0),(s1,t0),(sm,tm)>
kSubBP.m_uiI0 = uiI01;
kSubBP.m_uiI1 = rkBP.m_uiI1;
kSubBP.m_uiI2 = uiI12;
kSubBP.m_aakXuu[0] = kXuu01;
kSubBP.m_aakXuu[1] = rkBP.m_aakXuu[1];
kSubBP.m_aakXuu[2] = kXuu12;
kSubBP.m_aakXvv[0] = kXvv01;
kSubBP.m_aakXvv[1] = rkBP.m_aakXvv[1];
kSubBP.m_aakXvv[2] = kXvv12;
kSubBP.m_aakXhh[0] = kXhh01;
kSubBP.m_aakXhh[1] = rkBP.m_aakXhh[1];
kSubBP.m_aakXhh[2] = kXhh12;
SubdivideLL(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);
// subtriangle <(s0,tm),(sm,tm),(s0,t1)>
kSubBP.m_uiI0 = uiI02;
kSubBP.m_uiI1 = uiI12;
kSubBP.m_uiI2 = rkBP.m_uiI2;
kSubBP.m_aakXuu[0] = kXuu02;
kSubBP.m_aakXuu[1] = kXuu12;
kSubBP.m_aakXuu[2] = rkBP.m_aakXuu[2];
kSubBP.m_aakXvv[0] = kXvv02;
kSubBP.m_aakXvv[1] = kXvv12;
kSubBP.m_aakXvv[2] = rkBP.m_aakXvv[2];
kSubBP.m_aakXhh[0] = kXhh02;
kSubBP.m_aakXhh[1] = kXhh12;
kSubBP.m_aakXhh[2] = rkBP.m_aakXhh[2];
SubdivideLL(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);
// subtriangle <(sm,t0),(sm,tm),(s0,tm)>
kSubBP.m_uiI0 = uiI01;
kSubBP.m_uiI1 = uiI12;
kSubBP.m_uiI2 = uiI02;
kSubBP.m_aakXuu[0] = kXuu01;
kSubBP.m_aakXuu[1] = kXuu12;
kSubBP.m_aakXuu[2] = kXuu02;
kSubBP.m_aakXvv[0] = kXvv01;
kSubBP.m_aakXvv[1] = kXvv12;
kSubBP.m_aakXvv[2] = kXvv02;
kSubBP.m_aakXhh[0] = kXhh01;
kSubBP.m_aakXhh[1] = kXhh12;
kSubBP.m_aakXhh[2] = kXhh02;
SubdivideUR(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);
}
}
//----------------------------------------------------------------------------
void MgcBezierTriangle3G::SubdivideUR (unsigned int uiLevel, MgcReal fDSqr,
MgcVector3* akX, MgcVector3* akXu, MgcVector3* akXv,
BlockParameters& rkBP)
{
/*
i2 i1
+----+
\ |
\|
+
i0
*/
// subdivision indices
unsigned int uiI12 = (rkBP.m_uiI1 + rkBP.m_uiI2) >> 1;
unsigned int uiD12 = rkBP.m_uiI1 - rkBP.m_uiI2;
unsigned int uiI01 = (((rkBP.m_uiI0+rkBP.m_uiI1) << 2)+uiD12*uiD12) >> 3;
unsigned int uiI02 = uiI01 - (uiD12 >> 1);
// vertices
// top u-edge subdivision
MgcVector3 kXuu12 = 0.5*(rkBP.m_aakXuu[1] + rkBP.m_aakXuu[2]);
MgcVector3 kXvv12 = 0.5*(rkBP.m_aakXvv[1] + rkBP.m_aakXvv[2]);
MgcVector3 kXhh12 = 0.5*(rkBP.m_aakXhh[1] + rkBP.m_aakXhh[2]);
akX[uiI12] = 0.5*(akX[rkBP.m_uiI1] + akX[rkBP.m_uiI2] - fDSqr*kXuu12);
// right v-edge subdivision
MgcVector3 kXuu01 = 0.5*(rkBP.m_aakXuu[0] + rkBP.m_aakXuu[1]);
MgcVector3 kXvv01 = 0.5*(rkBP.m_aakXvv[0] + rkBP.m_aakXvv[1]);
MgcVector3 kXhh01 = 0.5*(rkBP.m_aakXhh[0] + rkBP.m_aakXhh[1]);
akX[uiI01] = 0.5*(akX[rkBP.m_uiI0] + akX[rkBP.m_uiI1] - fDSqr*kXvv01);
// hypotenuse edge subdivision
MgcVector3 kXuu02 = 0.5*(rkBP.m_aakXuu[0] + rkBP.m_aakXuu[2]);
MgcVector3 kXvv02 = 0.5*(rkBP.m_aakXvv[0] + rkBP.m_aakXvv[2]);
MgcVector3 kXhh02 = 0.5*(rkBP.m_aakXhh[0] + rkBP.m_aakXhh[2]);
akX[uiI02] = 0.5*(akX[rkBP.m_uiI0] + akX[rkBP.m_uiI2] - fDSqr*kXhh02);
// derivatives (for normal vectors)
if ( akXu )
{
// top u-edge subdivision
akXu[uiI12] = 0.5*(akXu[rkBP.m_uiI1] + akXu[rkBP.m_uiI2] -
fDSqr*rkBP.m_kXuuu);
akXv[uiI12] = 0.5*(akXv[rkBP.m_uiI1] + akXv[rkBP.m_uiI2] -
fDSqr*rkBP.m_kXuuv);
// right v-edge subdivision
akXu[uiI01] = 0.5*(akXu[rkBP.m_uiI0] + akXu[rkBP.m_uiI1] -
fDSqr*rkBP.m_kXuvv);
akXv[uiI01] = 0.5*(akXv[rkBP.m_uiI0] + akXv[rkBP.m_uiI1] -
fDSqr*rkBP.m_kXvvv);
// hypotenuse edge subdivision
akXu[uiI02] = 0.5*(akXu[rkBP.m_uiI0] + akXu[rkBP.m_uiI2] -
fDSqr*rkBP.m_kXhhu);
akXv[uiI02] = 0.5*(akXv[rkBP.m_uiI0] + akXv[rkBP.m_uiI2] -
fDSqr*rkBP.m_kXhhv);
}
// recurse on four children
if ( uiLevel > 0 )
{
uiLevel--;
fDSqr *= 0.25;
BlockParameters kSubBP;
// subtriangle <(sm,tm),(sm,t1),(s0,t1)>
kSubBP.m_uiI0 = uiI02;
kSubBP.m_uiI1 = uiI12;
kSubBP.m_uiI2 = rkBP.m_uiI2;
kSubBP.m_aakXuu[0] = kXuu02;
kSubBP.m_aakXuu[1] = kXuu12;
kSubBP.m_aakXuu[2] = rkBP.m_aakXuu[2];
kSubBP.m_aakXvv[0] = kXvv02;
kSubBP.m_aakXvv[1] = kXvv12;
kSubBP.m_aakXvv[2] = rkBP.m_aakXvv[2];
kSubBP.m_aakXhh[0] = kXhh02;
kSubBP.m_aakXhh[1] = kXhh12;
kSubBP.m_aakXhh[2] = rkBP.m_aakXhh[2];
SubdivideUR(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);
// subtriangle <(s1,tm),(s1,t1),(sm,t1)>
kSubBP.m_uiI0 = uiI01;
kSubBP.m_uiI1 = rkBP.m_uiI1;
kSubBP.m_uiI2 = uiI12;
kSubBP.m_aakXuu[0] = kXuu01;
kSubBP.m_aakXuu[1] = rkBP.m_aakXuu[1];
kSubBP.m_aakXuu[2] = kXuu12;
kSubBP.m_aakXvv[0] = kXvv01;
kSubBP.m_aakXvv[1] = rkBP.m_aakXvv[1];
kSubBP.m_aakXvv[2] = kXvv12;
kSubBP.m_aakXhh[0] = kXhh01;
kSubBP.m_aakXhh[1] = rkBP.m_aakXhh[1];
kSubBP.m_aakXhh[2] = kXhh12;
SubdivideUR(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);
// subtriangle <(s1,t0),(s1,tm),(sm,tm)>
kSubBP.m_uiI0 = rkBP.m_uiI0;
kSubBP.m_uiI1 = uiI01;
kSubBP.m_uiI2 = uiI02;
kSubBP.m_aakXuu[0] = rkBP.m_aakXuu[0];
kSubBP.m_aakXuu[1] = kXuu01;
kSubBP.m_aakXuu[2] = kXuu02;
kSubBP.m_aakXvv[0] = rkBP.m_aakXvv[0];
kSubBP.m_aakXvv[1] = kXvv01;
kSubBP.m_aakXvv[2] = kXvv02;
kSubBP.m_aakXhh[0] = rkBP.m_aakXhh[0];
kSubBP.m_aakXhh[1] = kXhh01;
kSubBP.m_aakXhh[2] = kXhh02;
SubdivideUR(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);
// subtriangle <(sm,tm),(s1,tm),(sm,t1)>
kSubBP.m_uiI0 = uiI02;
kSubBP.m_uiI1 = uiI01;
kSubBP.m_uiI2 = uiI12;
kSubBP.m_aakXuu[0] = kXuu02;
kSubBP.m_aakXuu[1] = kXuu01;
kSubBP.m_aakXuu[2] = kXuu12;
kSubBP.m_aakXvv[0] = kXvv02;
kSubBP.m_aakXvv[1] = kXvv01;
kSubBP.m_aakXvv[2] = kXvv12;
kSubBP.m_aakXhh[0] = kXhh02;
kSubBP.m_aakXhh[1] = kXhh01;
kSubBP.m_aakXhh[2] = kXhh12;
SubdivideLL(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);
}
}
//----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -