Beispiel #1
0
Trafo rot (const Vector3D& A, float theta)
{
  Trafo D;
  float v, w, c = cos(theta), s = sin(theta), c1 = 1-c;
    
  // compute unit vector E in direction of axis A
  float n = Norm(A);
  if (n == 0) return Trafo(0); // return 0 if axis is not defined
  Vector3D E (A.x/n,A.y/n,A.z/n);

  // no translation (last column is zero)
  D.m[0][3] = D.m[1][3] = D.m[2][3] = 0;

  // diagonal
  D.m[0][0] = c + c1 * E.x * E.x;
  D.m[1][1] = c + c1 * E.y * E.y;
  D.m[2][2] = c + c1 * E.z * E.z;

  // off diagonal
  v = c1 * E.x * E.y; w =  s * E.z; 
  D.m[0][1] = v + w;
  D.m[1][0] = v - w;
  v = c1 * E.x * E.z; w = -s * E.y;
  D.m[0][2] = v + w;
  D.m[2][0] = v - w;
  v = c1 * E.y * E.z; w =  s * E.x;
  D.m[1][2] = v + w;
  D.m[2][1] = v - w;

  return D;
}
Beispiel #2
0
Trafo invert (const Trafo &A)
{
  double d,d1,d2,d3,d10,d11,d12;
  Trafo Ai;

  d1 = A.m[1][1]*A.m[2][2]-A.m[1][2]*A.m[2][1];
  d2 = A.m[1][0]*A.m[2][2]-A.m[1][2]*A.m[2][0];
  d3 = A.m[1][0]*A.m[2][1]-A.m[1][1]*A.m[2][0];
  d = A.m[0][0]*d1-A.m[0][1]*d2+A.m[0][2]*d3;
  if (fabs(d) < 1e-6) return Trafo(0);	
  d10 = A.m[1][2]*A.m[2][3]-A.m[2][2]*A.m[1][3];
  d11 = A.m[1][1]*A.m[2][3]-A.m[2][1]*A.m[1][3];
  d12 = A.m[1][0]*A.m[2][3]-A.m[2][0]*A.m[1][3];
  Ai.m[0][0] = d1/d;
  Ai.m[1][0] = -d2/d;
  Ai.m[2][0] = d3/d;
  Ai.m[0][1] = (A.m[0][2]*A.m[2][1]-A.m[0][1]*A.m[2][2])/d;
  Ai.m[1][1] = (A.m[0][0]*A.m[2][2]-A.m[0][2]*A.m[2][0])/d;
  Ai.m[2][1] = (A.m[0][1]*A.m[2][0]-A.m[0][0]*A.m[2][1])/d;
  Ai.m[0][2] = (A.m[0][1]*A.m[1][2]-A.m[0][2]*A.m[1][1])/d;
  Ai.m[1][2] = (A.m[0][2]*A.m[1][0]-A.m[0][0]*A.m[1][2])/d;
  Ai.m[2][2] = (A.m[0][0]*A.m[1][1]-A.m[1][0]*A.m[0][1])/d;
  Ai.m[0][3] = (-A.m[0][1]*d10+A.m[0][2]*d11-A.m[0][3]*d1)/d;
  Ai.m[1][3] = (A.m[0][0]*d10-A.m[0][2]*d12+A.m[0][3]*d2)/d;
  Ai.m[2][3] = (-A.m[0][0]*d11+A.m[0][1]*d12-A.m[0][3]*d3)/d;
  return Ai;
}
 // interface layer to inherited class Mp3dView: 
 // set selected view for active graph
 void GetSelectionView (Trafo& trafo, float& fov) 
 {
   Mp3dView::GetTrafo(trafo,fov);
   // undo translation of center
   Trafo invT = invert(view->GetActiveGraphPtr()->viewcenter);
   if (invT != Trafo(0)) trafo = trafo * invT; 
 }
Beispiel #4
0
        /**
         * @brief    Forward transform
         *
         * @param  m To transform
         * @return   Transform
         */
        inline
        Matrix <T>
        operator*    (const Matrix <T> & m) {

            if (_wl_fam == ID)
                return m;
            else
            {
                Matrix <T> res (m);
                Trafo (m, res);
                return res;
            }

        }
Beispiel #5
0
	/**
	 * @brief    Forward transform
	 *
	 * @param  m To transform
	 * @return   Transform
	 */
	template <class T> Matrix<T> 
	operator*    (const Matrix<T>& m) {
		return Trafo (m);
	}
Beispiel #6
0
	/**
	 * @brief    Forward transform
	 *
	 * @param  m To transform
	 * @return   Transform
	 */
	virtual Matrix< std::complex<T> >
	operator* (const Matrix< std::complex<T> >& m) const {
		return Trafo(m);
	}
Beispiel #7
0
	/**
	 * @brief    Forward transform
	 *
	 * @param  m To transform
	 * @return   Transform
	 */
	inline virtual Matrix<CT>
	operator* (const Matrix<CT>& m) const {
		return Trafo(m);
	}
Beispiel #8
0
	virtual Matrix<T> operator* (const MatrixType<T>& m) const {
		return Trafo(m);
	}