0031687: Draw Harness, ViewerTest - extend command vrenderparams with option updating...
[occt.git] / src / GeomPlate / GeomPlate_PlateG1Criterion.cxx
1 // Created on: 1997-03-05
2 // Created by: Joelle CHAUVET
3 // Copyright (c) 1997-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <AdvApp2Var_Context.hxx>
19 #include <AdvApp2Var_Criterion.hxx>
20 #include <AdvApp2Var_Patch.hxx>
21 #include <GeomPlate_PlateG1Criterion.hxx>
22 #include <gp_Pnt.hxx>
23 #include <gp_Vec.hxx>
24 #include <gp_XY.hxx>
25 #include <PLib.hxx>
26 #include <TColgp_SequenceOfXY.hxx>
27 #include <TColgp_SequenceOfXYZ.hxx>
28 #include <TColStd_HArray1OfReal.hxx>
29
30 //  static Standard_Boolean  first = Standard_True;
31 //============================================================================
32 //function : GeomPlate_PlateG1Criterion 
33 //purpose  :
34 //============================================================================
35 GeomPlate_PlateG1Criterion::
36 GeomPlate_PlateG1Criterion(const TColgp_SequenceOfXY& Data,
37                            const TColgp_SequenceOfXYZ& G1Data,
38                            const Standard_Real Maximum,
39                            const AdvApp2Var_CriterionType Type,
40                            const AdvApp2Var_CriterionRepartition Repart)
41 {
42   myData=Data;
43   myXYZ=G1Data;
44   myMaxValue = Maximum;
45   myType = Type;
46   myRepartition = Repart;
47 }
48
49
50 //============================================================================
51 //function : Value
52 //purpose  :
53 //============================================================================
54
55 void GeomPlate_PlateG1Criterion::Value(AdvApp2Var_Patch& P,
56                                        const AdvApp2Var_Context& C) const
57 {
58   Standard_Real UInt[2],VInt[2];
59   Standard_Integer MaxNbCoeff[2], NbCoeff[2];
60   Standard_Real * adrCoeff = NULL ;
61   adrCoeff = (Standard_Real *) &P.Coefficients(1,C) ->ChangeArray1()(P.Coefficients(1,C)->Lower());
62
63   MaxNbCoeff[0] = C.ULimit();
64   MaxNbCoeff[1] = C.VLimit();
65   NbCoeff[0] = P.NbCoeffInU();
66   NbCoeff[1] = P.NbCoeffInV();
67   UInt[0] = P.U0();
68   UInt[1] = P.U1();
69   VInt[0] = P.V0();
70   VInt[1] = P.V1();
71
72   Standard_Real up,vp, ang = 0.;
73   
74   Standard_Integer dimension = 3 * NbCoeff[1];
75   TColStd_Array1OfReal Patch(1, NbCoeff[0] * dimension);
76   TColStd_Array1OfReal Curve(1, 2*dimension);
77   TColStd_Array1OfReal Point(1, 3); 
78   Standard_Real * Coeffs =  (Standard_Real *) &Patch.ChangeValue(1);
79   Standard_Real * Digit  =  (Standard_Real *) &Point.ChangeValue(1);
80   
81   Standard_Integer k1, k2, pos, ll=1;
82   for (k1 = 1; k1 <= NbCoeff[0]; k1++) {
83 // JAG 99.04.29    pos = 3*(MaxNbCoeff[0])*(k1-1);
84     pos = 3*(MaxNbCoeff[1])*(k1-1);
85     for (k2 = 1; k2 <= NbCoeff[1]; k2++, pos+=3 ) {
86       Patch(ll)   =  adrCoeff[pos];
87       Patch(ll+1) =  adrCoeff[pos+1];
88       Patch(ll+2) =  adrCoeff[pos+2];
89       ll += 3;
90     }
91   }
92
93   Standard_Integer i, NbCtr = myData.Length();
94   for(i=1; i<=NbCtr; i++) {
95     gp_Vec v1s,v2s,v3s;
96     gp_Vec v3h(myXYZ.Value(i).X(),myXYZ.Value(i).Y(),myXYZ.Value(i).Z());
97     gp_XY P2d = myData.Value(i);
98       if ( UInt[0]<P2d.X() && P2d.X()<UInt[1]
99           && VInt[0]<P2d.Y() && P2d.Y()<VInt[1] ) {
100 //   u,v recadres sur (-1,1)
101         up = (2*P2d.X()-UInt[0]-UInt[1])
102               / (UInt[1]-UInt[0]) ;
103         vp = (2*P2d.Y()-VInt[0]-VInt[1])
104               / (VInt[1]-VInt[0]) ;
105         PLib::EvalPoly2Var(up,vp,
106                            1,0,
107                            NbCoeff[0]-1,NbCoeff[1]-1,3,
108                            Coeffs[0],
109                            Digit[0]);
110
111         v1s.SetCoord(1,Digit[0]);
112         v1s.SetCoord(2,Digit[1]);
113         v1s.SetCoord(3,Digit[2]);
114
115         PLib::EvalPoly2Var(up,vp,
116                            0,1,
117                            NbCoeff[0]-1,NbCoeff[1]-1,3,
118                            Coeffs[0],
119                            Digit[0]);
120       
121         v2s.SetCoord(1,Digit[0]);
122         v2s.SetCoord(2,Digit[1]);
123         v2s.SetCoord(3,Digit[2]);
124
125         v3s=v1s^v2s;
126         if( v3s.Angle(v3h)>(M_PI/2)) {
127           if ((M_PI-v3s.Angle(v3h))>ang) {
128             ang=(M_PI-v3s.Angle(v3h));
129           }
130         }
131         else {
132           if(v3s.Angle(v3h)>ang) {
133             ang=v3s.Angle(v3h);
134           }
135         }
136       }
137   }
138   P.SetCritValue(ang);
139 }
140
141
142 //============================================================================
143 //function : IsSatisfied
144 //purpose  :
145 //============================================================================
146
147 Standard_Boolean GeomPlate_PlateG1Criterion::IsSatisfied(const AdvApp2Var_Patch& P) const
148 {
149   return (P.CritValue() < myMaxValue);
150 }
151