// Copyright (c) 1995-1999 Matra Datavision // Copyright (c) 1999-2014 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // // This library is free software; you can redistribute it and/or modify it under // the terms of the GNU Lesser General Public License version 2.1 as published // by the Free Software Foundation, with special exception defined in the file // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT // distribution for complete text of the license and disclaimer of any warranty. // // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. #include #include #include #include #include #include #include #include #include #include GProp_SelGProps::GProp_SelGProps(){} void GProp_SelGProps::SetLocation(const gp_Pnt& SLocation ) { loc = SLocation; } void GProp_SelGProps::Perform(const gp_Cylinder& S, const Standard_Real Alpha1, const Standard_Real Alpha2, const Standard_Real Z1, const Standard_Real Z2) { Standard_Real X0,Y0,Z0,Xa1,Ya1,Za1,Xa2,Ya2,Za2,Xa3,Ya3,Za3; S.Location().Coord(X0,Y0,Z0); Standard_Real R = S.Radius(); S.Position().XDirection().Coord(Xa1,Ya1,Za1); S.Position().YDirection().Coord(Xa2,Ya2,Za2); S.Position().Direction().Coord(Xa3,Ya3,Za3); dim = R*(Z2-Z1)*(Alpha2-Alpha1); Standard_Real SA2 = Sin(Alpha2); Standard_Real SA1 = Sin(Alpha1); Standard_Real CA2 = Cos(Alpha2); Standard_Real CA1 = Cos(Alpha1); Standard_Real Ix = R*(SA2-SA1)/(Alpha2-Alpha1); Standard_Real Iy = R*(CA1-CA2)/(Alpha2-Alpha1); g.SetCoord( X0 + Ix*Xa1+Iy*Xa2 + Xa3*(Z2+Z1)/2., Y0 + Ix*Ya1+Iy*Ya2 + Ya3*(Z2+Z1)/2., Z0 + Ix*Za1+Iy*Za2 + Za3*(Z2+Z1)/2.); Standard_Real ICn2 =R*R*( Alpha2-Alpha1 + SA2*CA2 - SA1*CA1 )/2.; Standard_Real ISn2 =R*R*( Alpha2-Alpha1 - SA2*CA2 + SA1*CA1 )/2.; Standard_Real IZ2 = (Alpha2-Alpha1)*(Z2*Z2+Z2*Z1+Z1*Z1)/3.; Standard_Real ICnSn= R*R*( SA2*SA2-SA1*SA1)/2.; Standard_Real ICnz = (Z2+Z1)*(SA2-SA1)/2.; Standard_Real ISnz = (Z2+Z1)*(CA1-CA2)/2.; math_Matrix Dm(1,3,1,3); Dm(1,1) = ISn2 + IZ2; Dm(2,2) = ICn2 + IZ2; Dm(3,3) = Alpha2-Alpha1; Dm(1,2) = Dm(2,1) = -ICnSn; Dm(1,3) = Dm(3,1) = -ICnz; Dm(3,2) = Dm(2,3) = -ISnz; math_Matrix Passage (1,3,1,3); Passage(1,1) = Xa1; Passage(1,2) = Xa2 ;Passage(1,3) = Xa3; Passage(2,1) = Ya1; Passage(2,2) = Ya2 ;Passage(2,3) = Ya3; Passage(3,1) = Za1; Passage(3,2) = Za2 ;Passage(3,3) = Za3; math_Jacobi J(Dm); R = R*(Z2-Z1); math_Vector V1(1,3), V2(1,3), V3(1,3); J.Vector(1,V1); V1.Multiply(Passage,V1); V1.Multiply(R*J.Value(1)); J.Vector(2,V2); V2.Multiply(Passage,V2); V2.Multiply(R*J.Value(2)); J.Vector(3,V3); V3.Multiply(Passage,V3); V3.Multiply(R*J.Value(3)); inertia = gp_Mat (gp_XYZ(V1(1),V2(1),V3(1)), gp_XYZ(V1(2),V2(2),V3(2)), gp_XYZ(V1(3),V2(3),V3(3))); gp_Mat Hop; GProp::HOperator(g,loc,dim,Hop); inertia = inertia+Hop; } void GProp_SelGProps::Perform (const gp_Cone& S, const Standard_Real Alpha1, const Standard_Real Alpha2, const Standard_Real Z1, const Standard_Real Z2) { Standard_Real X0,Y0,Z0,Xa1,Ya1,Za1,Xa2,Ya2,Za2,Xa3,Ya3,Za3; S.Location().Coord(X0,Y0,Z0); S.Position().XDirection().Coord(Xa1,Ya1,Za1); S.Position().YDirection().Coord(Xa2,Ya2,Za2); S.Position().Direction().Coord(Xa3,Ya3,Za3); Standard_Real t =S.SemiAngle(); Standard_Real Cnt = Cos(t); Standard_Real Snt = Sin(t); Standard_Real R = S.RefRadius(); Standard_Real Sn2 = Sin(Alpha2); Standard_Real Sn1 = Sin(Alpha1); Standard_Real Cn2 = Cos(Alpha2); Standard_Real Cn1 = Cos(Alpha1); Standard_Real Auxi1 = R + (Z2+Z1)*Snt/2.; Standard_Real Auxi2 = (Z2*Z2+Z1*Z2+Z1*Z1)/3.; dim = (Alpha2-Alpha1)*Cnt*(Z2-Z1)*Auxi1; Standard_Real Ix = (R*R+R*(Z2+Z1)*Snt + Snt*Auxi2)/Auxi1; Standard_Real Iy = Ix*(Cn1-Cn2)/(Alpha2-Alpha1); Ix = Ix*(Sn2-Sn1)/(Alpha2-Alpha1); Standard_Real Iz = Cnt*(R*(Z2+Z1)/2.+Snt*Auxi2)/Auxi1; g.SetCoord(X0 + Xa1*Ix+ Xa2*Iy+ Xa3*Iz, Y0 + Ya1*Ix+ Ya2*Iy+ Ya3*Iz, Z0 + Za1*Ix+ Za2*Iy+ Za3*Iz); Standard_Real R1 = R+Z1*Snt; Standard_Real R2 = R+Z2*Snt; Standard_Real ZZ = (Z2-Z1)*Cnt; Standard_Real IR2 = ZZ*Snt*(R1*R1*R1+R1*R1*R2+R1*R2*R2+R2*R2*R2)/4.; Standard_Real ICn2 = IR2*(Alpha2-Alpha1+Cn2*Sn2-Cn1*Sn1)/2.; Standard_Real ISn2 = IR2*(Alpha2-Alpha1+Cn2*Sn2-Cn1*Sn1)/2.; Standard_Real IZ2 = ZZ*Cnt*Cnt*(Z2-Z1)*(Alpha2-Alpha1)* (R*Auxi2 +Snt*(Z2*Z2*Z2+Z2*Z2*Z1+Z2*Z1*Z1+Z1*Z1*Z1))/4.; Standard_Real ICnSn = IR2*(Cn2*Cn2-Cn1*Cn1); Standard_Real ICnz = Cnt*Snt*ZZ*(R*(Z1+Z2)/2.+Auxi2)*(Sn2-Sn1); Standard_Real ISnz = Cnt*Snt*ZZ*(R*(Z1+Z2)/2.+Auxi2)*(Cn1-Cn2); math_Matrix Dm(1,3,1,3); Dm(1,1) = ISn2 + IZ2; Dm(2,2) = ICn2 + IZ2; Dm(3,3) = IR2*(Alpha2-Alpha1); Dm(1,2) = Dm(2,1) = -ICnSn; Dm(1,3) = Dm(3,1) = -ICnz; Dm(3,2) = Dm(2,3) = -ISnz; math_Matrix Passage (1,3,1,3); Passage(1,1) = Xa1; Passage(1,2) = Xa2 ;Passage(1,3) = Xa3; Passage(2,1) = Ya1; Passage(2,2) = Ya2 ;Passage(2,3) = Ya3; Passage(3,1) = Za1; Passage(3,2) = Za2 ;Passage(3,3) = Za3; math_Jacobi J(Dm); math_Vector V1(1,3),V2(1,3),V3(1,3); J.Vector(1,V1); V1.Multiply(Passage,V1); V1.Multiply(J.Value(1)); J.Vector(2,V2); V2.Multiply(Passage,V2); V2.Multiply(J.Value(2)); J.Vector(3,V3); V3.Multiply(Passage,V3); V3.Multiply(J.Value(3)); inertia = gp_Mat (gp_XYZ(V1(1),V2(1),V3(1)), gp_XYZ(V1(2),V2(2),V3(2)), gp_XYZ(V1(3),V2(3),V3(3))); gp_Mat Hop; GProp::HOperator(g,loc,dim,Hop); inertia = inertia+Hop; } void GProp_SelGProps::Perform(const gp_Sphere& S, const Standard_Real Teta1, const Standard_Real Teta2, const Standard_Real Alpha1, const Standard_Real Alpha2) { Standard_Real X0,Y0,Z0,Xa1,Ya1,Za1,Xa2,Ya2,Za2,Xa3,Ya3,Za3; S.Location().Coord(X0,Y0,Z0); S.Position().XDirection().Coord(Xa1,Ya1,Za1); S.Position().YDirection().Coord(Xa2,Ya2,Za2); S.Position().Direction().Coord(Xa3,Ya3,Za3); Standard_Real R = S.Radius(); Standard_Real Cnt1 = Cos(Teta1); Standard_Real Snt1 = Sin(Teta1); Standard_Real Cnt2 = Cos(Teta2); Standard_Real Snt2 = Sin(Teta2); Standard_Real Cnf1 = Cos(Alpha1); Standard_Real Snf1 = Sin(Alpha1); Standard_Real Cnf2 = Cos(Alpha2); Standard_Real Snf2 = Sin(Alpha2); dim = R*R*(Teta2-Teta1)*(Snf2-Snf1); Standard_Real Ix = R*(Snt2-Snt1)/(Teta2-Teta1)* (Alpha2-Alpha1+Snf2*Cnf2-Snf1*Cnf1)/(Snf2-Snf1)/2.; Standard_Real Iy = R*(Cnt1-Cnt2)/(Teta2-Teta1)* (Alpha2-Alpha1+Snf2*Cnf2-Snf1*Cnf1)/(Snf2-Snf1)/2.; Standard_Real Iz = R*(Snf2+Snf1)/2.; g.SetCoord( X0 + Ix*Xa1 + Iy*Xa2 + Iz*Xa3, Y0 + Ix*Ya1 + Iy*Ya2 + Iz*Ya3, Z0 + Ix*Za1 + Iy*Za2 + Iz*Za3); Standard_Real IR2 = ( Cnf2*Snf2*(Cnf2+1.)- Cnf1*Snf1*(Cnf1+1.) + Alpha2-Alpha1 )/3.; Standard_Real ICn2 = (Teta2-Teta1+ Cnt2*Snt2-Cnt1*Snt1)*IR2/2.; Standard_Real ISn2 = (Teta2-Teta1-Cnt2*Snt2+Cnt1*Snt1)*IR2/2.; Standard_Real ICnSn = ( Snt2*Snt2-Snt1*Snt1)*IR2/2.; Standard_Real IZ2 = (Teta2-Teta1)*(Snf2*Snf2*Snf2-Snf1*Snf1*Snf1)/3.; Standard_Real ICnz =(Snt2-Snt1)*(Cnf1*Cnf1*Cnf1-Cnf2*Cnf2*Cnf2)/3.; Standard_Real ISnz =(Cnt1-Cnt2)*(Cnf1*Cnf1*Cnf1-Cnf2*Cnf2*Cnf2)/3.; math_Matrix Dm(1,3,1,3); Dm(1,1) = ISn2 +IZ2; Dm(2,2) = ICn2 +IZ2; Dm(3,3) = IR2*(Teta2-Teta1); Dm(1,2) = Dm(2,1) = -ICnSn; Dm(1,3) = Dm(3,1) = -ICnz; Dm(3,2) = Dm(2,3) = -ISnz; math_Matrix Passage (1,3,1,3); Passage(1,1) = Xa1; Passage(1,2) = Xa2 ;Passage(1,3) = Xa3; Passage(2,1) = Ya1; Passage(2,2) = Ya2 ;Passage(2,3) = Ya3; Passage(3,1) = Za1; Passage(3,2) = Za2 ;Passage(3,3) = Za3; math_Jacobi J(Dm); R = R*R*R*R; math_Vector V1(1,3), V2(1,3), V3(1,3); J.Vector(1,V1); V1.Multiply(Passage,V1); V1.Multiply(R*J.Value(1)); J.Vector(2,V2); V2.Multiply(Passage,V2); V2.Multiply(R*J.Value(2)); J.Vector(3,V3); V3.Multiply(Passage,V3); V3.Multiply(R*J.Value(3)); inertia = gp_Mat (gp_XYZ(V1(1),V2(1),V3(1)), gp_XYZ(V1(2),V2(2),V3(2)), gp_XYZ(V1(3),V2(3),V3(3))); gp_Mat Hop; GProp::HOperator(g,loc,dim,Hop); inertia = inertia+Hop; } void GProp_SelGProps::Perform (const gp_Torus& S, const Standard_Real Teta1, const Standard_Real Teta2, const Standard_Real Alpha1, const Standard_Real Alpha2) { Standard_Real X0,Y0,Z0,Xa1,Ya1,Za1,Xa2,Ya2,Za2,Xa3,Ya3,Za3; S.Location().Coord(X0,Y0,Z0); S.XAxis().Direction().Coord(Xa1,Ya1,Za1); S.YAxis().Direction().Coord(Xa2,Ya2,Za2); S.Axis().Direction().Coord(Xa3,Ya3,Za3); Standard_Real RMax = S.MajorRadius(); Standard_Real Rmin = S.MinorRadius(); Standard_Real Cnt1 = Cos(Teta1); Standard_Real Snt1 = Sin(Teta1); Standard_Real Cnt2 = Cos(Teta2); Standard_Real Snt2 = Sin(Teta2); Standard_Real Cnf1 = Cos(Alpha1); Standard_Real Snf1 = Sin(Alpha1); Standard_Real Cnf2 = Cos(Alpha2); Standard_Real Snf2 = Sin(Alpha2); dim = RMax*Rmin*(Teta2-Teta1)*(Alpha2-Alpha1); Standard_Real Ix = (Snt2-Snt1)/(Teta2-Teta1)*(Rmin*(Snf2-Snf1)/(Alpha2-Alpha1) + RMax); Standard_Real Iy = (Cnt1-Cnt2)/(Teta2-Teta1)*(Rmin*(Snf2-Snf1)/(Alpha2-Alpha1) + RMax); Standard_Real Iz = Rmin*(Cnf1-Cnf2)/(Alpha2-Alpha1); g.SetCoord( X0+Ix*Xa1+Iy*Xa2+Iz*Xa3, Y0+Ix*Ya1+Iy*Ya2+Iz*Ya3, Z0+Ix*Za1+Iy*Za2+Iz*Za3); Standard_Real IR2 = RMax*RMax + 2.*RMax*Rmin*(Snf2-Snf1) + Rmin*Rmin/2.*(Snf2*Cnf2-Snf1*Cnf1); Standard_Real ICn2 = IR2*(Teta2-Teta1 +Snt2*Cnt2-Snt1*Cnt1)/2.; Standard_Real ISn2 = IR2*(Teta2-Teta1 -Snt2*Cnt2+Snt1*Cnt1)/2.; Standard_Real ICnSn = IR2*(Snt2*Snt2-Snt1*Snt1)/2.; Standard_Real IZ2 = (Teta2-Teta1)*Rmin*Rmin*(Alpha2-Alpha1-Snf2*Cnf2+Snf1*Cnf1)/2.; Standard_Real ICnz = Rmin*(Snt2-Snt1)*(Cnf1-Cnf2)*(RMax+Rmin*(Cnf1+Cnf2)/2.); Standard_Real ISnz = Rmin*(Cnt2-Cnt1)*(Cnf1-Cnf2)*(RMax+Rmin*(Cnf1+Cnf2)/2.); math_Matrix Dm(1,3,1,3); Dm(1,1) = ISn2 + IZ2; Dm(2,2) = ICn2 + IZ2; Dm(3,3) = IR2*(Teta2-Teta1); Dm(1,2) = Dm(2,1) = -ICnSn; Dm(1,3) = Dm(3,1) = -ICnz; Dm(3,2) = Dm(2,3) = -ISnz; math_Matrix Passage (1,3,1,3); Passage(1,1) = Xa1; Passage(1,2) = Xa2 ;Passage(1,3) = Xa3; Passage(2,1) = Ya1; Passage(2,2) = Ya2 ;Passage(2,3) = Ya3; Passage(3,1) = Za1; Passage(3,2) = Za2 ;Passage(3,3) = Za3; math_Jacobi J(Dm); RMax = RMax*Rmin; math_Vector V1(1,3), V2(1,3), V3(1,3); J.Vector(1,V1); V1.Multiply(Passage,V1); V1.Multiply(RMax*J.Value(1)); J.Vector(2,V2); V2.Multiply(Passage,V2); V2.Multiply(RMax*J.Value(2)); J.Vector(3,V3); V3.Multiply(Passage,V3); V3.Multiply(RMax*J.Value(3)); inertia = gp_Mat (gp_XYZ(V1(1),V2(1),V3(1)), gp_XYZ(V1(2),V2(2),V3(2)), gp_XYZ(V1(3),V2(3),V3(3))); gp_Mat Hop; GProp::HOperator(g,loc,dim,Hop); inertia = inertia+Hop; } GProp_SelGProps::GProp_SelGProps (const gp_Cone& S, const Standard_Real Alpha1, const Standard_Real Alpha2, const Standard_Real Z1, const Standard_Real Z2, const gp_Pnt& SLocation ) { SetLocation(SLocation); Perform(S,Alpha1,Alpha2,Z1,Z2); } GProp_SelGProps::GProp_SelGProps (const gp_Cylinder& S, const Standard_Real Alpha1, const Standard_Real Alpha2, const Standard_Real Z1, const Standard_Real Z2, const gp_Pnt& SLocation) { SetLocation(SLocation); Perform(S,Alpha1,Alpha2,Z1,Z2); } GProp_SelGProps::GProp_SelGProps (const gp_Sphere& S, const Standard_Real Teta1, const Standard_Real Teta2, const Standard_Real Alpha1, const Standard_Real Alpha2, const gp_Pnt& SLocation) { SetLocation(SLocation); Perform(S,Teta1,Teta2,Alpha1,Alpha2); } GProp_SelGProps::GProp_SelGProps (const gp_Torus& S, const Standard_Real Teta1, const Standard_Real Teta2, const Standard_Real Alpha1, const Standard_Real Alpha2, const gp_Pnt& SLocation) { SetLocation(SLocation); Perform(S,Teta1,Teta2,Alpha1,Alpha2); }