summaryrefslogtreecommitdiff
path: root/inc/AppParCurves_Variational_4.gxx
blob: 2e8052082ecefb22dc94be5d6576324d8fdd99b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// File:	AppParCurves_Variational_4.gxx
// Created:	Tue Dec  8 12:31:51 1998
// Author:	Igor FEOKTISTOV
//		<ifv@paradox.nnov.matra-dtv.fr>


void AppParCurves_Variational::ACR(Handle(FEmTool_Curve)& Curve,
				   TColStd_Array1OfReal& Ti,
				   const Standard_Integer Decima) const
{

  const Standard_Real Eps = 1.e-8;

  TColStd_Array1OfReal& Knots = Curve->Knots(); 
  Standard_Integer NbrPnt = Ti.Length(), TiFirst = Ti.Lower(), TiLast = Ti.Upper(),
                   KFirst = Knots.Lower(), KLast = Knots.Upper();

  Standard_Real CbLong, DeltaT, VTest, UNew, UOld, DU, TPara, TOld, DTInv, Ratio;
  Standard_Integer ipnt, ii, IElm, IOld, POld, PCnt, ICnt=0;
  Standard_Integer NbCntr = myNbPassPoints + myNbTangPoints + myNbCurvPoints;

  //     (1) Calcul de la longueur de courbe

  Curve->Length(Ti(TiFirst), Ti(TiLast), CbLong);

  //     (2)  Mise de l'acr dans Ti

  if(NbrPnt >= 2) {

    //     (2.0) Initialisation
    DeltaT = (Ti(TiLast) - Ti(TiFirst)) / Decima;
    VTest = Ti(TiFirst) + DeltaT;

    if(NbCntr > 0) {
      PCnt = myTypConstraints->Value(1) - myFirstPoint + TiFirst;
      ICnt = 1;
    }
    else
      PCnt = TiLast + 1;

    UOld = 0.;

    TOld = Ti(TiFirst);
    POld = TiFirst;

    IElm = KFirst;
    IOld = IElm;

    Ti(TiFirst) = 0.;

    for(ipnt = TiFirst + 1; ipnt <= TiLast; ipnt++) {

      while((ICnt <= NbCntr) && (PCnt < ipnt)) {
	ICnt++;
	PCnt = myTypConstraints->Value(2*ICnt-1) - myFirstPoint + TiFirst;
      }
      
      TPara = Ti(ipnt);

      if(TPara >= VTest || PCnt == ipnt) {
      
	if ( Ti(TiLast) - TPara <= 1.e-2*DeltaT) {
	  ipnt = TiLast;
	  TPara = Ti(ipnt);
	}
	//        (2.2), (2.3) Cacul la longueur de courbe
	Curve->Length(Ti(TiFirst), TPara, UNew);

	UNew /= CbLong;

	while(Knots(IElm + 1) < TPara && IElm < KLast - 1) IElm++;

	//         (2.4) Mise a jours des parametres de decoupe
	DTInv = 1. / (TPara - TOld);
	DU = UNew - UOld;

	for(ii = IOld+1; ii <= IElm; ii++) {
	  Ratio = (Knots(ii) - TOld) * DTInv;
	  Knots(ii) = UOld + Ratio * DU;
	}
      
	//           (2.5) Mise a jours des parametres de points.

	//Very strange loop, because it never works (POld+1 > ipnt-1)
	for(ii = POld+1; ii <= ipnt-1; ii++) {
	  Ratio = ( Ti(ii) - TOld ) * DTInv;
	  Ti(ii) = UOld + Ratio * DU;
	}

	Ti(ipnt) = UNew;

	UOld = UNew;
	IOld = IElm;
	TOld = TPara;
	POld = ipnt;

      }
      //        --> Nouveau seuil parametrique pour le decimage
        
      if(TPara >= VTest) {
//	ii = RealToInt((TPara - VTest + Eps) / DeltaT);
//	VTest += (ii + 1) * DeltaT;
	VTest += Ceiling((TPara - VTest + Eps) / DeltaT) * DeltaT;
	if(VTest > 1. - Eps) VTest = 1.;
      }
    }
  }

  //     --- On ajuste les valeurs extremes

  Ti(TiFirst) = 0.;
  Ti(TiLast) = 1.;
  ii = TiLast - 1;
  while ( Ti(ii) > Knots(KLast) ) {
    Ti(ii) = 1.;
    --ii;
  }
  Knots(KFirst) = 0.;
  Knots(KLast) = 1.;
  
}