void gearFunction(double* pz, double* pf) { double ah; double* messer; messer= new double[3]; def_messer(pz, messer); // Position der Schneide am Messerkopf messer[0]+=rho; messer[1]-=xmk; // Messerkopfrotation mit Parameter v D3(messer,pz[1]); // Lage des Messerkopfs auf der Wiege messer[2]-=ymk; // Eindrehen in Orientierung der Wiege ah=messer[0]; messer[0]=messer[1]; messer[1]=ah; messer[2]=-messer[2]; // Verschiebung messer[0]-=xmw; messer[1]+=zmw; messer[2]+=ymw; // Wiegenwinkel thetaW, entspricht dem wert t=0 // + Wiegenbewegung mit Parameter t ah = theta_w+pz[2]; D3(messer,ah); // Achsversatz messer[0]+=m; // Eindrehen in Orientierung des Werkrades messer[0]=-messer[0]; ah=messer[1]; messer[1]=-messer[2]; messer[2]=-ah; // Teilkegeloeffnungswinkel delta, y-Achsen entgegengesetzt D1(messer,delta); // neue Verschiebung der Werkradachse messer[2]+=zwr+st; // gekoppelte Werkraddrehung in Abhaengigkeit von t und v ah = (1/sin(delta))*pz[2] + (double(zm)/zz)*pz[1]; D2(pf,messer,ah); delete[] messer; }
// 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); }