Exemplo n.º 1
0
  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);
      
      };
 
  }
Exemplo n.º 2
0
// 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);
}