Esempio n. 1
0
void Thread::setConstraints(Vector3d* positions, Vector3d* tangents)
{
  for (int i = 0; i < 2; i++)
  {
    _positions[i] = positions[i];

    _tangents[i] = tangents[i];
    _tangents[i].normalize();
  }

	
	Vector3d axis = Vector3d::UnitX().cross(_tangents[0]);
	if (axis.norm() != 0.0)
		axis.normalize();
  Matrix3d rot_to_start(Eigen::AngleAxisd(acos(Vector3d::UnitX().dot(_tangents[0])),axis));

	_transform_to_start = Matrix4d::Zero();
	_transform_to_start.corner(Eigen::TopLeft,3,3) = rot_to_start;
	//_transform_to_start.corner(Eigen::TopRight,3,1) = _positions[0];
	_transform_to_start(3,3) = 1.0;
	_translate_to_start = Matrix4d::Identity();
  _translate_to_start.corner(Eigen::TopRight,3,1) = _positions[0];

	inverseTransform(_transform_to_start, _transform_to_unit);
	
  //add scaling factors to make it so we can solve in canonical form, with thread length 1
/*	_transform_to_start.corner(Eigen::TopLeft,3,3) = _length*_transform_to_start.corner(Eigen::TopLeft,3,3);
	_transform_to_unit.corner(Eigen::TopLeft,3,3) = (1.0/_length)*_transform_to_unit.corner(Eigen::TopLeft,3,3);
	_transform_to_unit.corner(Eigen::TopRight,3,1) = (1.0/_length)*_transform_to_unit.corner(Eigen::TopRight,3,1);
*/
//	std::cout << "transform to unit vector: " << _transform_to_unit << std::endl;
//	std::cout << "transform to start vector: " << _transform_to_start << std::endl;
	
}
Esempio n. 2
0
void ImageViewer::on_actionDFT_triggered()
{
    cv::Mat cvMat = ASM::QPixmapToCvMat(QPixmap::fromImage(*image));
    cv::Mat grayscaleMat (cvMat.size(), CV_8U);
    cv::cvtColor( cvMat, grayscaleMat, CV_BGR2GRAY );

    int width = grayscaleMat.cols;
    int height = grayscaleMat.rows;

    cv::Mat cvMat_dft =  computeDFT(grayscaleMat);
    cv::Mat magI;
    updateMag(cvMat_dft,magI);


    //Mat mask = createBoxMask(cvMat_dft.size(), cvMat_dft.cols/2, cvMat_dft.rows/2,cvMat_dft.cols/8,cvMat_dft.rows/8, true);
    Mat mask = createGausFilterMask(cvMat_dft.size(), cvMat_dft.cols/2, cvMat_dft.rows/2,cvMat_dft.cols/2,cvMat_dft.rows/2, true, true);
    std::cout << "before mul spect  " << grayscaleMat.size() << "   " << cvMat_dft.size() << "  " <<  "  " << mask.size() << std::endl;

    shift(mask);

    Mat planes[] = {Mat::zeros(cvMat_dft.size(), CV_32F), Mat::zeros(cvMat_dft.size(), CV_32F)};
    Mat kernel_spec;
    planes[0] = mask; // real
    planes[1] = mask; // imaginar

    merge(planes, 2, kernel_spec);

    mulSpectrums(cvMat_dft, kernel_spec, cvMat_dft , DFT_ROWS); // only DFT_ROWS accepted
    cv::Mat magI2;
    updateMag(cvMat_dft,magI2);		// show spectrum


    cv::Mat inverseTransform;
    cv::dft(cvMat_dft,inverseTransform,cv::DFT_INVERSE|cv::DFT_REAL_OUTPUT);
    normalize(inverseTransform, inverseTransform, 0, 255, CV_MINMAX);
    cv::Mat finalImage = inverseTransform;
    if(width <inverseTransform.cols || height<inverseTransform.rows) {
        finalImage = inverseTransform(Rect(0,0,width,height));
    }
    // Back to 8-bits
    cv::Mat finalImage2;
    finalImage.convertTo(finalImage2, CV_8U);

    if(!scene) scene = new QGraphicsScene;
    if(!view) view = new QGraphicsView(scene);
    if(item) {
        scene->clear();
        //delete item; item=0;
    }
    item = new QGraphicsPixmapItem(ASM::cvMatToQPixmap(finalImage2).copy());
    scene->addItem(item);
    view->adjustSize();
    view->show();

}
void QFourierTransformer::transform(float input[], float output[], Direction direction)
{
	if(direction == QFourierTransformer::Forward)
	{
		forwardTransform(input, output);
	}
	else
	{
		inverseTransform(input, output);
	}
}
Esempio n. 4
0
void KisBrush::generateBoundary() const
{
    KisFixedPaintDeviceSP dev;
    KisDabShape inverseTransform(1.0 / scale(), 1.0, -angle());

    if (brushType() == IMAGE || brushType() == PIPE_IMAGE) {
        dev = paintDevice(KoColorSpaceRegistry::instance()->rgb8(),
            inverseTransform, KisPaintInformation());
    }
    else {
        const KoColorSpace* cs = KoColorSpaceRegistry::instance()->rgb8();
        dev = new KisFixedPaintDevice(cs);
        mask(dev, KoColor(Qt::black, cs), inverseTransform, KisPaintInformation());
    }

    d->boundary = new KisBoundary(dev);
    d->boundary->generateBoundary();
}
void Foam::scaleSearchableSurface::getNormal
(
    const List<pointIndexHit>& info,
    vectorField& normal
) const
{
    vectorField iNormal;
    
    transformationSearchableSurface::getNormal
        (
            info,
            iNormal
        );

    normal.setSize(iNormal.size());

    forAll(normal,i) {
        normal[i]=inverseTransform(iNormal[i]);
        normal[i]/=mag(normal[i]);
    }
Esempio n. 6
0
void Thread::optimizeManyPoints(MatrixXd& constraints, int num_pts_between, vector<double>&curvatures_resampled, vector<double>& torsions_resampled, Matrix4d& start_transform)
{
  int num_constraints = constraints.rows()-1;
  int num_pieces_reopt = num_pts_between*num_constraints;
  double length_per_piece = 1.0/( num_pieces_reopt);
  
  //opt_params_many_points.transform_back = _transform_to_start;
  opt_params_many_points.num_segments = num_pieces_reopt;
  opt_params_many_points.length_per_segment = length_per_piece;


  opt_params_many_points.points.resize(num_constraints);
  opt_params_many_points.orig_params_each_piece = new NEWMAT::ColumnVector(2*num_pieces_reopt+3);
  opt_params_many_points.num_pts_between = num_pts_between;

  opt_params_many_points.gravity_multipler = (GRAVITY_CONSTANT)*_length;
  opt_params_many_points.total_length = _length;


  for (int i=0; i < num_constraints; i++)
  {
    for (int j=0; j < num_pts_between; j++)
    {
      int piece_num = i*num_pts_between+j;
      opt_params_many_points.orig_params_each_piece->element(2*piece_num) = curvatures_resampled[i];
      opt_params_many_points.orig_params_each_piece->element(2*piece_num+1) = torsions_resampled[i];
    }
  }

  

  double eulerZ, eulerY, eulerX;
  eulerAnglesFramTransform(start_transform.corner(Eigen::TopLeft,3,3), eulerZ, eulerY, eulerX);
  opt_params_many_points.orig_params_each_piece->element(2*num_pieces_reopt) = eulerZ;
  opt_params_many_points.orig_params_each_piece->element(2*num_pieces_reopt+1) = eulerY;
  opt_params_many_points.orig_params_each_piece->element(2*num_pieces_reopt+2) = eulerX;

  for (int i=0; i < num_constraints; i++)
  {
    opt_params_many_points.points[i] = ((constraints.block((i+1),0,1,3) - constraints.block(0,0,1,3))/_length).transpose();
  }


  NEWMAT::ColumnVector x_sol;

  optimize_FDNLF(2*opt_params_many_points.num_segments+3, energyEvalFunctionManyPoints, energyEvalFunctionManyPoints_init, x_sol);


  std::cout << "done re-optimizing" << std::endl;
  delete opt_params_many_points.orig_params_each_piece;

 
  //set thread params
  _positions[0] = constraints.block(0,0,1,3).transpose();
  transformFromEulerAngles(_transform_to_start, x_sol(2*num_pieces_reopt+1), x_sol(2*num_pieces_reopt+2));
	_translate_to_start = Matrix4d::Identity();
  _translate_to_start.corner(Eigen::TopRight,3,1) = _positions[0];

  _tangents[0] = _transform_to_start.corner(Eigen::TopLeft,3,1);
  //_tangents[0] = orig_thread->_tangents[0];

  _angle_first_rot = x_sol(2*num_pieces_reopt+3);

	inverseTransform(_transform_to_start, _transform_to_unit);



  Matrix4d transform_back;
  getStartTransform(transform_back);
  transform_back.corner(Eigen::TopLeft,3,3) *= _length;
  threadList = new ThreadPiece(x_sol(1), x_sol(2), length_per_piece);
  ThreadPiece* currPiece = threadList;
  for (int i=1; i < num_pieces_reopt; i++)
  {
    currPiece->addSegmentAfter(new ThreadPiece(x_sol(2*i+1), x_sol(2*i+2), length_per_piece));
    transform_back *= currPiece->_transform;
    currPiece = currPiece->_next_segment;
  }

  //_positions[1] = transform_back.corner(Eigen::TopRight,3,1);
 // _positions[1] = orig_thread->_positions[1];
 // _tangents[1] = orig_thread->_tangents[1];
 // _tangents[1].normalize();
 // _tangents[0].normalize();

  _positions[1] = transform_back.corner(Eigen::TopRight,3,1);
  _tangents[1] = transform_back.corner(Eigen::TopLeft,3,1);
  _tangents[1].normalize();

  //printThreadInfo();



}
Esempio n. 7
0
void VrmlNodePlaneSensor::activate( double timeStamp,
				    bool isActive,
				    double *p )
{
  // Become active
  if ( isActive && ! d_isActive.get() )
    {
      d_isActive.set(isActive);

      float V[3] = { (float)p[0], (float)p[1], (float)p[2] };
      double M[4][4];
      inverseTransform( M );
      VM( V, M, V );
      d_activationPoint.set( V[0], V[1], V[2] );
#if 0
      theSystem->warn(" planesensor: activate at (%g %g %g)\n",
		      p[0],p[1],p[2]);
      theSystem->warn(" planesensor: local coord (%g %g %g)\n",
		      V[0],V[1],V[2]);
#endif
      eventOut( timeStamp, "isActive", d_isActive );
    }

  // Become inactive
  else if ( ! isActive && d_isActive.get() )
    {
#if 0
      theSystem->warn(" planesensor: deactivate\n");
#endif
      d_isActive.set(isActive);
      eventOut( timeStamp, "isActive", d_isActive );

      // auto offset
      if ( d_autoOffset.get() )
	{
	  d_offset = d_translation;
	  eventOut( timeStamp, "offset_changed", d_offset );
	}
    }

  // Tracking
  else if ( isActive )
    {
      float V[3] = { (float)p[0], (float)p[1], (float)p[2] };
      double M[4][4];
      inverseTransform( M );
      VM( V, M, V );
#if 0
      theSystem->warn(" planesensor: track at (%g %g %g)\n",
		      p[0],p[1],p[2]);
      
      theSystem->warn(" planesensor: local cd (%g %g %g)\n",
		      V[0],V[1],V[2]);
#endif
      d_trackPoint.set( V[0], V[1], V[2] );
      eventOut( timeStamp, "trackPoint_changed", d_trackPoint );

      float t[3];
      t[0] = V[0] - d_activationPoint.x() + d_offset.x();
      t[1] = V[1] - d_activationPoint.y() + d_offset.y();
      t[2] = 0.0;

      if ( d_minPosition.x() == d_maxPosition.x() )
	t[0] = d_minPosition.x();
      else if ( d_minPosition.x() < d_maxPosition.x() )
	{
	  if (t[0] < d_minPosition.x())
	    t[0] = d_minPosition.x();
	  else if (t[0] > d_maxPosition.x())
	    t[0] = d_maxPosition.x();
	}

      if ( d_minPosition.y() == d_maxPosition.y() )
	t[1] = d_minPosition.y();
      else if ( d_minPosition.y() < d_maxPosition.y() )
	{
	  if (t[1] < d_minPosition.y())
	    t[1] = d_minPosition.y();
	  else if (t[1] > d_maxPosition.y())
	    t[1] = d_maxPosition.y();
	}

      d_translation.set( t[0], t[1], t[2] );
      eventOut( timeStamp, "translation_changed", d_translation );
    }
}