0022048: Visualization, AIS_InteractiveContext - single object selection should alway...
[occt.git] / src / GProp / GProp_CelGProps.cxx
CommitLineData
b311480e 1// Copyright (c) 1995-1999 Matra Datavision
973c2be1 2// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 3//
973c2be1 4// This file is part of Open CASCADE Technology software library.
b311480e 5//
d5f74e42 6// This library is free software; you can redistribute it and/or modify it under
7// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 8// by the Free Software Foundation, with special exception defined in the file
9// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10// distribution for complete text of the license and disclaimer of any warranty.
b311480e 11//
973c2be1 12// Alternatively, this file may be used under the terms of Open CASCADE
13// commercial license or contractual agreement.
b311480e 14
42cf5bc1 15
16#include <ElCLib.hxx>
7fd59977 17#include <gp.hxx>
42cf5bc1 18#include <gp_Circ.hxx>
19#include <gp_Lin.hxx>
20#include <gp_Pnt.hxx>
7fd59977 21#include <gp_Vec.hxx>
42cf5bc1 22#include <GProp.hxx>
23#include <GProp_CelGProps.hxx>
24#include <math_Jacobi.hxx>
7fd59977 25#include <math_Matrix.hxx>
26#include <math_Vector.hxx>
42cf5bc1 27#include <Standard_NotImplemented.hxx>
7fd59977 28
29GProp_CelGProps::GProp_CelGProps(){}
30
31void GProp_CelGProps::SetLocation(const gp_Pnt& CLocation)
32{
33 loc = CLocation;
34}
35
36
37void GProp_CelGProps::Perform(const gp_Circ& C,
38 const Standard_Real U1,
39 const Standard_Real U2)
40{
41 Standard_Real X0,Y0,Z0,Xa1,Ya1,Za1,Xa2,Ya2,Za2,Xa3,Ya3,Za3;
42 C.Location().Coord(X0,Y0,Z0);
43 C.XAxis().Direction().Coord(Xa1,Ya1,Za1);
44 C.YAxis().Direction().Coord(Xa2,Ya2,Za2);
45 C.Axis().Direction().Coord(Xa3,Ya3,Za3);
46 Standard_Real Ray = C.Radius();
47
48 dim = Ray*Abs(U2-U1);
49 Standard_Real xloc =Ray*(Sin(U2)-Sin(U1))/(U2-U1);
50 Standard_Real yloc =Ray*(Cos(U1)-Cos(U2))/(U2-U1);
51
52 g.SetCoord(xloc*Xa1+yloc*Xa2+X0,xloc*Ya1+yloc*Ya2+Y0,Z0);
53
54 math_Matrix Dm(1,3,1,3);
55 Dm(1,1)= Ray*Ray*Ray*(U2/2-U1/2-Sin(2*U2)/4+Sin(2*U1)/4);
56 Dm(2,2)= Ray*Ray*Ray*(U2/2-U1/2+Sin(2*U2)/4-Sin(2*U1)/4);
57 Dm(3,3)= Ray*Ray*dim;
58 Dm(2,1)= Dm(1,2) = - Ray*Ray*Ray*(Cos(2*U1)/4-Cos(2*U2)/4);
59 Dm(3,1) = Dm(1,3) = 0.;
60 Dm(3,2) = Dm(2,3) = 0.;
61 math_Matrix Passage (1,3,1,3);
62 Passage(1,1) = Xa1; Passage(1,2) = Xa2 ;Passage(1,3) = Xa3;
63 Passage(2,1) = Ya1; Passage(2,2) = Ya2 ;Passage(2,3) = Ya3;
64 Passage(3,1) = Za1; Passage(3,2) = Za2 ;Passage(3,3) = Za3;
65
66 math_Jacobi J(Dm);
67 math_Vector V1(1,3),V2(1,3),V3(1,3);
68 J.Vector(1,V1);
69 V1.Multiply(Passage,V1);
70 V1.Multiply(J.Value(1));
71 J.Vector(2,V2);
72 V2.Multiply(Passage,V2);
73 V2.Multiply(J.Value(2));
74 J.Vector(3,V3);
75 V3.Multiply(Passage,V3);
76 V3.Multiply(J.Value(3));
77
78 inertia = gp_Mat (gp_XYZ(V1(1),V2(1),V3(1)),
79 gp_XYZ(V1(2),V2(2),V3(2)),
80 gp_XYZ(V1(3),V2(3),V3(3)));
81
82 gp_Mat Hop;
83 GProp::HOperator(g,loc,dim,Hop);
84 inertia = inertia+Hop;
85}
86
87
88void GProp_CelGProps::Perform(const gp_Lin& C,
89 const Standard_Real U1,
90 const Standard_Real U2)
91{
92 gp_Ax1 Pos = C.Position();
93 gp_Pnt P1 = ElCLib::LineValue(U1,Pos);
94 dim =Abs(U2-U1);
95 gp_Pnt P2 = ElCLib::LineValue(U2,Pos);
96 g.SetCoord((P1.X()+P2.X())/2.,(P1.Y()+P2.Y())/2.,(P1.Z()+P2.Z())/2.);
97 Standard_Real Vx,Vy,Vz,X0,Y0,Z0;
98 Pos.Direction().Coord(Vx,Vy,Vz);
99 Pos.Location().Coord(X0,Y0,Z0);
100 Standard_Real alfa1 = (Vz*Vz+Vy*Vy)/3.;
101 Standard_Real alfa2 = Vy*Y0+Vz*Z0;
102 Standard_Real alfa3 = Y0*Y0+Z0*Z0;
103 Standard_Real Ixx = (U2*(U2*(U2*alfa1+alfa2)+alfa3)) -
104 (U1*(U1*(U1*alfa1+alfa2)+alfa3));
105 alfa1 = (Vz*Vz+Vx*Vx)/3.;
106 alfa2 = Vx*X0+Vz*Z0;
107 alfa3 = X0*X0+Z0*Z0;
108 Standard_Real Iyy = (U2*(U2*(U2*alfa1+alfa2)+alfa3)) -
109 (U1*(U1*(U1*alfa1+alfa2)+alfa3));
110 alfa1 = (Vy*Vy+Vx*Vx)/3.;
111 alfa2 = Vy*Y0+Vz*Z0;
112 alfa3 = Y0*Y0+Z0*Z0;
113 Standard_Real Izz = (U2*(U2*(U2*alfa1+alfa2)+alfa3)) -
114 (U1*(U1*(U1*alfa1+alfa2)+alfa3));
115 alfa1 = (Vy*Vx)/3.;
116 alfa2 = (Vy*X0+Vx*Y0)/2.;
117 alfa3 = Y0*X0;
118 Standard_Real Ixy = (U2*(U2*(U2*alfa1+alfa2)+alfa3)) -
119 (U1*(U1*(U1*alfa1+alfa2)+alfa3));
120 alfa1 = (Vz*Vx)/3.;
121 alfa2 = (Vz*X0+Vx*Z0)/2;
122 alfa3 = Z0*X0;
123 Standard_Real Ixz = (U2*(U2*(U2*alfa1+alfa2)+alfa3)) -
124 (U1*(U1*(U1*alfa1+alfa2)+alfa3));
125 alfa1 = (Vy*Vz)/3.;
126 alfa2 = (Vy*Z0+Vz*Y0)/2.;
127 alfa3 = Y0*Z0;
128 Standard_Real Iyz = (U2*(U2*(U2*alfa1+alfa2)+alfa3)) -
129 (U1*(U1*(U1*alfa1+alfa2)+alfa3));
130
131 inertia = gp_Mat (gp_XYZ (Ixx, -Ixy,-Ixz),
132 gp_XYZ (-Ixy, Iyy,-Iyz),
133 gp_XYZ (-Ixz,-Iyz, Izz));
134}
135
136
137GProp_CelGProps::GProp_CelGProps (const gp_Circ& C, const gp_Pnt& CLocation)
138{
139 SetLocation(CLocation);
c6541a0c 140 Perform(C,0.,2.*M_PI);
7fd59977 141}
142
143GProp_CelGProps::GProp_CelGProps (const gp_Circ& C,
144 const Standard_Real U1,
145 const Standard_Real U2,
146 const gp_Pnt& CLocation)
147{
148 SetLocation(CLocation);
149 Perform(C,U1,U2);
150}
151
152GProp_CelGProps::GProp_CelGProps (const gp_Lin& C,
153 const Standard_Real U1,
154 const Standard_Real U2,
155 const gp_Pnt& CLocation)
156{
157 SetLocation(CLocation);
158 Perform(C,U1,U2);
159}
160