- Standard_Real distmin = RealLast(), distmax = 0.0, TheDist;
-
- Standard_Integer NTmin=0,NUmin=0,NVmin=0;
- gp_Pnt PP1min, PP2min;
- Standard_Integer NTmax=0,NUmax=0,NVmax=0;
- gp_Pnt PP1max, PP2max;
- for ( NoT = 1, t1 = t0; NoT <= mytsample; NoT++, t1 += PasT) {
- P1 = mypoints1->Value(NoT);
- for ( NoU = 1, U = U0; NoU <= myusample; NoU++, U += PasU) {
- for ( NoV = 1, V = V0; NoV <= myvsample; NoV++, V += PasV) {
- P2 = mypoints2->Value(NoU, NoV);
- TheDist = P1.SquareDistance(P2);
- if (TheDist < distmin) {
- distmin = TheDist;
- NTmin = NoT;
- NUmin = NoU;
- NVmin = NoV;
- PP1min = P1;
- PP2min = P2;
- }
- if (TheDist > distmax) {
- distmax = TheDist;
- NTmax = NoT;
- NUmax = NoU;
- NVmax = NoV;
- PP1max = P1;
- PP2max = P2;
- }
- }
+ Standard_Real aCUAdd = (mytsup - mytmin) / mytsample;
+ Standard_Real aSUAdd = (myusup - myumin) / myusample;
+ Standard_Real aSVAdd = (myvsup - myvmin) / myvsample;
+ TColgp_HArray1OfPnt aCPs(1, mytsample);
+ TColgp_HArray2OfPnt aSPs(1, myusample, 1, myvsample);
+ Standard_Integer aRestIterCount = 3;
+ // The value is calculated by the bug CR23830.
+ Standard_Integer aCUDen = 2, aSUDen = 2, aSVDen = 2;
+ Standard_Boolean anAreAvSqsInited = Standard_False;
+ Standard_Real aCUSq = 0, aSUSq = 0, aSVSq = 0;
+ while (aRestIterCount--)
+ {
+ Standard_Real aMinCU, aMinSU, aMinSV, aMaxCU, aMaxSU, aMaxSV;
+ Standard_Real aMinSqDist = DBL_MAX, aMaxSqDist = -DBL_MAX;
+ for (Standard_Integer aSUNom = 1; aSUNom < aSUDen; aSUNom += 2)
+ {
+ Standard_Real aSU0 = myumin + (aSUNom * aSUAdd) / aSUDen;
+ for (Standard_Integer aSVNom = 1; aSVNom < aSVDen; aSVNom += 2)
+ {
+ Standard_Real aSV0 = myvmin + (aSVNom * aSVAdd) / aSVDen;
+ for (Standard_Integer aCUNom = 1; aCUNom < aCUDen; aCUNom += 2)
+ {
+ Standard_Real aCU0 = mytmin + (aCUNom * aCUAdd) / aCUDen;
+ Standard_Real aCU = aCU0;
+ for (Standard_Integer aCUI = 1; aCUI <= mytsample;
+ aCUI++, aCU += aCUAdd)
+ {
+ aCPs.SetValue(aCUI, C.Value(aCU));
+ }
+ //
+ aCU = aCU0;
+ Standard_Real aSU = aSU0;
+ for (Standard_Integer aSUI = 1; aSUI <= myusample;
+ aSUI++, aSU += aSUAdd)
+ {
+ Standard_Real aSV = aSV0;
+ for (Standard_Integer aSVI = 1; aSVI <= myvsample;
+ aSVI++, aSV += aSVAdd)
+ {
+ gp_Pnt aSP = myS->Value(aSU, aSV);
+ aSPs.ChangeValue(aSUI, aSVI) = aSP;
+ Standard_Real aCU = aCU0;
+ for (Standard_Integer aCUI = 1; aCUI <= mytsample;
+ aCUI++, aCU += aCUAdd)
+ {
+ Standard_Real aSqDist = aSP.SquareDistance(aCPs.Value(aCUI));
+ if (aSqDist < aMinSqDist)
+ {
+ aMinSqDist = aSqDist;
+ aMinCU = aCU;
+ aMinSU = aSU;
+ aMinSV = aSV;
+ }
+ if (aMaxSqDist < aSqDist)
+ {
+ aMaxSqDist = aSqDist;
+ aMaxCU = aCU;
+ aMaxSU = aSU;
+ aMaxSV = aSV;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ // Find min approximation.
+ UV(1) = aMinCU;
+ UV(2) = aMinSU;
+ UV(3) = aMinSV;
+ math_FunctionSetRoot anA(myF, UV, Tol, UVinf, UVsup, 100, aRestIterCount);
+ // Find max approximation.
+ if (!anA.IsDivergent() || !aRestIterCount)
+ {
+ UV(1) = aMaxCU;
+ UV(2) = aMaxSU;
+ UV(3) = aMaxSV;
+ math_FunctionSetRoot(myF, UV, Tol, UVinf, UVsup);
+ break;
+ }
+ //
+ if (!anAreAvSqsInited)
+ {
+ anAreAvSqsInited = Standard_True;
+ //
+ const gp_Pnt * aCP1 = &aCPs.Value(1);
+ for (Standard_Integer aCUI = 2; aCUI <= mytsample; aCUI++)
+ {
+ const gp_Pnt & aCP2 = aCPs.Value(aCUI);
+ aCUSq += aCP1->SquareDistance(aCP2);
+ aCP1 = &aCP2;
+ }
+ aCUSq /= mytsample - 1;
+ //
+ for (Standard_Integer aSVI = 1; aSVI <= myvsample; aSVI++)
+ {
+ const gp_Pnt * aSP1 = &aSPs.Value(1, aSVI);
+ for (Standard_Integer aSUI = 2; aSUI <= myusample; aSUI++)
+ {
+ const gp_Pnt & aSP2 = aSPs.Value(aSUI, aSVI);
+ aSUSq += aSP1->SquareDistance(aSP2);
+ aSP1 = &aSP2;
+ }
+ }
+ aSUSq /= myvsample * (myusample - 1);
+ //
+ for (Standard_Integer aSUI = 1; aSUI <= myusample; aSUI++)
+ {
+ const gp_Pnt * aSP1 = &aSPs.Value(aSUI, 1);
+ for (Standard_Integer aSVI = 2; aSVI <= myvsample; aSVI++)
+ {
+ const gp_Pnt & aSP2 = aSPs.Value(aSUI, aSVI);
+ aSVSq += aSP1->SquareDistance(aSP2);
+ aSP1 = &aSP2;
+ }
+ }
+ aSVSq /= myusample * (myvsample - 1);
+ }
+ //
+ if ((aSUSq <= aCUSq) && (aSVSq <= aCUSq))
+ {
+ aCUDen += aCUDen;
+ aCUSq /= 4;
+ }
+ else if ((aCUSq <= aSUSq) && (aSVSq <= aSUSq))
+ {
+ aSUDen += aSUDen;
+ aSUSq /= 4;
+ }
+ else
+ {
+ aSVDen += aSVDen;
+ aSVSq /= 4;