void OCCSurface :: DefineTangentialPlane (const Point<3> & ap1, const PointGeomInfo & geominfo1, const Point<3> & ap2, const PointGeomInfo & geominfo2) { if (projecttype == PLANESPACE) { p1 = ap1; p2 = ap2; //cout << "p1 = " << p1 << endl; //cout << "p2 = " << p2 << endl; GetNormalVector (p1, geominfo1, ez); ex = p2 - p1; ex -= (ex * ez) * ez; ex.Normalize(); ey = Cross (ez, ex); GetNormalVector (p2, geominfo2, n2); nmid = 0.5*(n2+ez); ez = nmid; ez.Normalize(); ex = (p2 - p1).Normalize(); ez -= (ez * ex) * ex; ez.Normalize(); ey = Cross (ez, ex); nmid = ez; //cout << "ex " << ex << " ey " << ey << " ez " << ez << endl; } else { if ( (geominfo1.u < umin) || (geominfo1.u > umax) || (geominfo2.u < umin) || (geominfo2.u > umax) || (geominfo1.v < vmin) || (geominfo1.v > vmax) || (geominfo2.v < vmin) || (geominfo2.v > vmax) ) throw UVBoundsException(); p1 = ap1; p2 = ap2; psp1 = Point<2>(geominfo1.u, geominfo1.v); psp2 = Point<2>(geominfo2.u, geominfo2.v); Vec<3> n; GetNormalVector (p1, geominfo1, n); gp_Pnt pnt; gp_Vec du, dv; occface->D1 (geominfo1.u, geominfo1.v, pnt, du, dv); DenseMatrix D1(3,2), D1T(2,3), DDTinv(2,2); D1(0,0) = du.X(); D1(1,0) = du.Y(); D1(2,0) = du.Z(); D1(0,1) = dv.X(); D1(1,1) = dv.Y(); D1(2,1) = dv.Z(); /* (*testout) << "DefineTangentialPlane" << endl << "---------------------" << endl; (*testout) << "D1 = " << endl << D1 << endl; */ Transpose (D1, D1T); DenseMatrix D1TD1(3,3); D1TD1 = D1T*D1; if (D1TD1.Det() == 0) throw SingularMatrixException(); CalcInverse (D1TD1, DDTinv); DenseMatrix Y(3,2); Vec<3> y1 = (ap2-ap1).Normalize(); Vec<3> y2 = Cross(n, y1).Normalize(); for (int i = 0; i < 3; i++) { Y(i,0) = y1(i); Y(i,1) = y2(i); } DenseMatrix A(2,2); A = DDTinv * D1T * Y; DenseMatrix Ainv(2,2); if (A.Det() == 0) throw SingularMatrixException(); CalcInverse (A, Ainv); for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) { Amat(i,j) = A(i,j); Amatinv(i,j) = Ainv(i,j); } Vec<2> temp = Amatinv * (psp2-psp1); double r = temp.Length(); // double alpha = -acos (temp(0)/r); double alpha = -atan2 (temp(1),temp(0)); DenseMatrix R(2,2); R(0,0) = cos (alpha); R(1,0) = -sin (alpha); R(0,1) = sin (alpha); R(1,1) = cos (alpha); A = A*R; if (A.Det() == 0) throw SingularMatrixException(); CalcInverse (A, Ainv); for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) { Amat(i,j) = A(i,j); Amatinv(i,j) = Ainv(i,j); } temp = Amatinv * (psp2-psp1); }; }
// the main function void activeGearFunction( adouble* z, // (u,v,t) Parametrisierung der Bewegung der Messerschneide adouble* f, // (x,y,z) Bewegte Messerschneide // jetzt kommen die ganzen Parameter double hgXmk, // Messerversatz double hgYmk, // MK-Versatz double hgKopSpW, // Kopfspanwinkel double hgFlaSpW, // Flankenspanwinkel double hgMeSchW, // Messerschwenkwinkel double hgFlKrRd, // Flugkreisradius double hgE, // Exzentrizitaet double hgExzenW, // Exzentrizitaetswinkel double hgThetaS, // Messerkopfschwenkung double hgThetaN, // Messerkopfneigung double hgXmw, // MK-x double hgYmw, // MK-y double hgZmw, // MK-z double hgThetaW, // Wiegenwinkel double hgM, // Achsversatz double hgZwr, // Verschiebung Werkradachse double hgDelta, // Teilkegeloeffnungswinkel double hgOmega, // double hgC, double hgR, // Kopfradius double hgRs, // Sphaerikradius double hgYs, // Sphaerik-Mitte-Y double hgZs, // Sphaerik-Mitte-Z // jetzt die Zusatzbewegungen int radialMotionDegree, adouble* radialMotionCoeff, int verticalMotionDegree, adouble* verticalMotionCoeff, int horizontalMotionDegree, adouble* horizontalMotionCoeff, int helicalMotionDegree, adouble* helicalMotionCoeff, int angularMotionDegree, adouble* angularMotionCoeff, int modifiedRollDegree, adouble* modifiedRollCoeff ) { int i; adouble ah; // Definition der Schneide def_messer(z,f,hgR,hgRs,hgYs,hgZs); // Position der Schneide am Messerkopf // (jetzt die Ber"ucksichtigung von hgKopSpW, hgFlaSpW, hgMeSchW) D2T(f,hgMeSchW); // Messerschwenkwinkel Theta_M D3T(f,hgFlaSpW); // Flankenspanwinkel Theta_F D1(f,hgKopSpW); // Kopfspanwinkel Theta_K // Position der Schneide am Messerkopf f[0] += hgFlKrRd; // Flugkreisradius f[1] -= hgXmk; // Messerversatz // Messerkopfrotation mit Parameter v D3(f,z[1]); // Lage des Messerkopfs auf der Wiege f[2] -= hgYmk; // Beruecksichtigung der Messerkopf-Exzentrizitaet f[0] += hgE * cos(hgExzenW); f[1] -= hgE * sin(hgExzenW); // Eindrehen in Orientierung der Wiege ah = f[0]; f[0] = f[1]; f[1] = ah; f[2] = -f[2]; // Beruecksichtigung von Messerkopf-Schwenkwinkel hgThetaS // und der Messerkopfneigung hgThetaN D3T(f,hgThetaS); // Einschwenken in die Neigungsachse D1T(f,hgThetaN); // Neigung um x-Achse D3(f,hgThetaS); // Rueckschwenken aus der Neigungsachse // Verschiebung f[0] -= hgXmw; // FLB1-x-Achse zeigt nach oben -> (-xNeu) f[1] += hgZmw; // FLB1-z-Achse zeigt nach rechts -> (yNeu) f[2] += hgYmw; // FLB1-y-Achse zeigt aus der Wiege -> (zNeu) // Wiegenwinkel thetaW, entspricht dem wert t=0 D3(f,hgThetaW); // ZUSATZBEWEGUNG Radial motion if (radialMotionDegree >= 0) { ah = 0.0; for (i=radialMotionDegree; i>0; i--) { ah += radialMotionCoeff[i]; ah *= z[2]; } ah += radialMotionCoeff[0]; f[1] += ah; // radiale Verschiebung des Messerkopfes } // Wiegenbewegung mit Parameter t D3(f,z[2]); // ZUSATZBEWEGUNG Vertical motion if (verticalMotionDegree >= 0) { ah = 0.0; for (i=verticalMotionDegree; i>0; i--) { ah += verticalMotionCoeff[i]; ah *= z[2]; } ah += verticalMotionCoeff[0]; f[0] += ah; // Achsversatz in positive x-Richtung } // originaler Achsversatz f[0] += hgM; // ZUSATZBEWEGUNG Horizontal motion if (horizontalMotionDegree >= 0) { ah = 0.0; for (i=horizontalMotionDegree; i>0; i--) { ah += horizontalMotionCoeff[i]; ah *= z[2]; } ah += horizontalMotionCoeff[0]; f[1] += ah; // Achsversatz in positive y-Richtung } // ZUSATZBEWEGUNG Helical motion if (helicalMotionDegree >= 0) { ah = 0.0; for (i=helicalMotionDegree; i>0; i--) { ah += helicalMotionCoeff[i]; ah *= z[2]; } ah += helicalMotionCoeff[0]; f[2] -= ah; // Tiefenposition in negative z-Richtung } // Eindrehen in Orientierung des Werkrades f[0] = -f[0]; ah = f[1]; f[1] = -f[2]; f[2] = -ah; // ZUSATZBEWEGUNG Angular motion if (angularMotionDegree >= 0) { ah = 0.0; for (i=angularMotionDegree; i>0; i--) { ah += angularMotionCoeff[i]; ah *= z[2]; } ah += angularMotionCoeff[0]; D1(f,ah); // umgekehrte Drehung um die x-Achse } // Teilkegeloeffnungswinkel delta - y-Achsen entgegengesetzt D1(f,hgDelta); // neue Verschiebung der Werkradachse f[2] += hgZwr; // z-Achse zeigt zu Spitze // ZUSATZBEWEGUNG Modified roll if (modifiedRollDegree >= 0) { ah = 0.0; for (i=modifiedRollDegree; i>1; i--) { ah += modifiedRollCoeff[i]; ah *= z[2]; } if (modifiedRollDegree > 0) ah += modifiedRollCoeff[1]; ah += hgOmega; ah *= z[2]; ah += modifiedRollCoeff[0]; } else { ah = hgOmega; ah *= z[2]; } ah += hgC*z[1]; // c*v + omega * t // gekoppelte Werkraddrehung in Abhaengigkeit von t und v D3(f,ah); }