コード例 #1
0
//------------------------------------------------------------------------------
// Slot function(s)
//------------------------------------------------------------------------------
bool Block::setSlotPosition(const Basic::List* const msg)
{
   bool ok = false;
   if (msg != 0) {
      int values[2];
      int n = msg->getNumberList(values, 2);
      if (n == 2) {
         ok = setInitPosition(values[0], values[1]);
      }
   }
   return ok;
}
コード例 #2
0
ファイル: Ribbon.cpp プロジェクト: MrMdR/julapy
void Ribbon :: init()
{
	setLength( RIBBON_DEFAULT_LENGTH );
	setWidth( RIBBON_DEFAULT_WIDTH );
	
	setInitPosition( 0, 0, 0 );
	setInitVelocity( 0, 0, 0 );
	setInitColor( 0, 0, 0, 1 );
	
	trailCount	= 1;
	
	upAxis.set( 0, 1, 0 );
	upAxisRot = 5;
}
コード例 #3
0
int Simulation::initializeSimulation(double deltaT, int iterations, char method, MatrixXi& TT, MatrixXd& TV, MatrixXd& B, vector<int>& moveVertices, vector<int> fixVertices, double youngs, double poissons){
	iters = iterations;

	if (method =='e'){
		integrator = new Verlet();
		cout<<"Initialized Verlet"<<endl;	
	}else if(method == 'i'){
		integrator = new ImplicitEuler();
		cout<<"Initialized Implicit Euler"<<endl;
	}
	else if(method == 'n'){
		integrator = new ImplicitNewmark();
		cout<<"Initialized Implicit Newmark"<<endl;
	}
	else{
		cout<<"Method not supported yet"<<endl;
		exit(0);
	}
	VectorXd force;
	force.resize(3*TV.rows());
	force.setZero();

	setInitPosition(force, fixVertices, moveVertices);

	if(moveVertices.size()>0 or fixVertices.size()>0){
		//cout << "DOING STUFFS" << endl;
		MatrixXd newTV;
		newTV.resize(TV.rows(), TV.cols());
		newTV.setZero();
		MatrixXi newTT;
		newTT.resize(TT.rows(), TT.cols());
		newTT.setZero();
		//cout << "MoveVertsSize :: " << moveVertices.size() << endl;

		//TODO: Make this shit more efficient
		//Hash maps or something
		vector<int> vertexNewIndices;
		for(int i=0; i<TV.rows(); i++){
			bool flag =false;
			for(unsigned int j=0; j<fixVertices.size(); j++){
				if(i==fixVertices[j]){
					flag = true;
				}
			}
			for(unsigned int j=0; j<moveVertices.size(); j++){
				if(i==moveVertices[j]){
					flag = true;
				}
			}
			// if vertex not fixed or moved, re-index to front
			//[v, v, v, v...., f, f, f...., m, m, m...,m]
			if(!flag){
				vertexNewIndices.push_back(i);
			}
		}
		//re-index fixed verts
		for(unsigned int j=0; j<fixVertices.size(); j++){
			vertexNewIndices.push_back(fixVertices[j]);
		}
		//re-index move verts
		for(unsigned int j=0; j<moveVertices.size(); j++){
			vertexNewIndices.push_back(moveVertices[j]);
		}

		//these are the new indices for the fixed verts
		vector<int> newfixIndices;
		for(unsigned int i= vertexNewIndices.size() - (moveVertices.size() + fixVertices.size()); i<(vertexNewIndices.size()-moveVertices.size()); i++){
			newfixIndices.push_back(i);
		}

		//new indices for the moving verts
		vector<int> newMoveIndices;
		for(unsigned int i= vertexNewIndices.size() - moveVertices.size(); i<vertexNewIndices.size(); i++){
			newMoveIndices.push_back(i);
		}

		//cout << "NewMoveIndicesSize :: " << newMoveIndices.size() << endl;

		VectorXd new_force;
		new_force.resize(3*TV.rows());
		reIndexTVandTT(vertexNewIndices, fixVertices.size(), moveVertices.size(), TV, TT, force, newTV, newTT, new_force);

		igl::barycenter(newTV, newTT, B);
		//Initialize Solid Mesh
		M.initializeMesh(newTT, newTV, youngs, poissons);
		if(moveVertices.size() != 0){
			// cout<<"Move vertices "<<moveVertices.size()<<endl;
			// cout<<"fix verts "<<fixVertices.size()<<endl;
			binarySearchYoungs(newMoveIndices, newTV, newTT, fixVertices.size(), B);
			// syntheticTests(newMoveIndices, newTV, newTT, fixVertices.size(), B);
		
		}
		
		integrator->initializeIntegrator(deltaT, M, newTV, newTT);
		this->external_force = new_force;
		integrator->fixVertices(newfixIndices);
		int ignorePastIndex = newTV.rows() - newfixIndices.size();
		staticSolveNewtonsForces(newTV, newTT, B, new_force, ignorePastIndex);


	}else{
		//cout << "Doing Other Stuffs" << endl;
		igl::barycenter(TV, TT, B);
		M.initializeMesh(TT, TV, youngs, poissons);
		integrator->initializeIntegrator(deltaT, M, TV, TT);
		this->external_force = force;
		integrator->fixVertices(fixVertices);
	}

	return 1;
}
コード例 #4
0
void SierpinskiCurve::generateCurve()
{
    // Vypočet velikosti rastru
    qDebug() <<"Zacinam generovat sierpiskiho krivku";
    int oneSideCount = 7;
    for(int i = 0; i < *iterations-1; i++)
        oneSideCount =(oneSideCount * 2) + 2;
    areas = oneSideCount*oneSideCount;
 qDebug() << "One side count - " << oneSideCount << " number of areas - " << areas;
    float areaWidth = 640.0 / (oneSideCount-*iterations);
    float areaHeight = 480.0 / (oneSideCount-*iterations);

    points.clear();
    notDrawnIDs.clear();

    // Rozsrastrování plochy a oindexování buňek
    // Razstrování probíhá po řádcích od buňky s pozicí (0,1) až po buňku (1,0)  - "od leveho spodniho rohu po pravý horní"

    for(int coefficientY = 0; coefficientY < oneSideCount; coefficientY++)
    {
        for(int coefficientX = 0; coefficientX < oneSideCount; coefficientX++)
        {
            Vector2 newPosition = Vector2(areaWidth * coefficientX  ,480 - (areaHeight * coefficientY) );
            point * newPoint = new point(-1,newPosition);
            points.push_back(newPoint);
        }
    }

    progressBar->setValue(0);
    allWorkPoints.clear();
    allJoints.clear();
    // Vytvoření základního tvaru sierpinskiho křivky (při iteraci 1)
    std::vector<workPoint> base;
    base.push_back(workPoint(1,0));
    base.push_back(workPoint(7,1));
    base.push_back(workPoint(15,2));
    base.push_back(workPoint(22,3));
    base.push_back(workPoint(29,4));
    base.push_back(workPoint(35,5));
    base.push_back(workPoint(43,6));
    base.push_back(workPoint(37,7));
    base.push_back(workPoint(38,8));
    base.push_back(workPoint(39,9));
    base.push_back(workPoint(47,10));
    base.push_back(workPoint(41,11));
    base.push_back(workPoint(33,12));
    base.push_back(workPoint(26,13));
    base.push_back(workPoint(19,14));
    base.push_back(workPoint(13,15));
    base.push_back(workPoint(5,16));
    base.push_back(workPoint(11,17));
    base.push_back(workPoint(10,18));
    base.push_back(workPoint(9,19));
    base.push_back(workPoint(1,20));
    lastCurveIndex = 20;
    // Vytvoření zakladního tvaru spoje
    std::vector<workPoint> baseJoint;
    baseJoint.push_back(workPoint(9,0,true));
    baseJoint.push_back(workPoint(12,1));
    baseJoint.push_back(workPoint(20,2,true));
    baseJoint.push_back(workPoint(41,3));
    baseJoint.push_back(workPoint(47,4,true));
    baseJoint.push_back(workPoint(44,5));
    baseJoint.push_back(workPoint(36,6,true));
    baseJoint.push_back(workPoint(15,7));

    allWorkPoints.insert(allWorkPoints.end(),base.begin(),base.end());
    //allJoints.insert(allJoints.end(),baseJoint.begin(),baseJoint.end());
    rowSize = 7;

    for(int i = 0; i < *iterations-1; i++){
        allWorkPoints.clear();
        allJoints.clear();

        rowSizeBefore = rowSize;
        // Samotný algoritmus generování
        // v podstatě funguje tak, že vezmu zakladni tvar (base) a zkopiruju ho 4x a vlozim je do vsech rohu
        // rohy ve stredu se odstrani

        std::vector<int> notDrawnsMemory = notDrawnIDs;

        // 1. tvar
         rowSize = rowSize*2 + 2;
        base = shrinkBase(base);
 baseJoint = shrinkBase(baseJoint);
        base = setInitPosition(1,base );
        if(*iterations>2)baseJoint = setInitPosition(1,baseJoint);
            base[11].dontDraw = true;
        allWorkPoints.insert(allWorkPoints.end(),base.begin(),base.end());
        if(*iterations>2) allJoints.insert(allJoints.end(),baseJoint.begin(),baseJoint.end());

        base[11].dontDraw = false;
        /*for(int j = 0; j <= *iterations-1;j++)
             base[11+ 80*j].dontDraw = false;*/
     //   notDrawnIDs.push_back(lastCurveIndex+1);
    //    notDrawnIDs.push_back(11);
        base[0].dontDraw = true;






        // 2. tvar
       if(*iterations>2) baseJoint = increaseCurveIndexes(baseJoint.size(),baseJoint);
        base = increaseCurveIndexes(base.size(),base);
        int  corrector = i-1;
        if(corrector < 0) corrector = 0;
        base = setInitPosition((rowSize * (rowSizeBefore+1 - (corrector*2)) ) +1 ,base );
    //    base = setInitPosition((rowSize * (rowSize - rowSizeBefore - 2))  + (rowSize +1) ,base );
        if(*iterations>2)baseJoint = setInitPosition(((rowSize/2)+1)*rowSize+1,baseJoint );
        allWorkPoints.insert(allWorkPoints.end(),base.begin(),base.end());
        if(*iterations>2) allJoints.insert(allJoints.end(),baseJoint.begin(),baseJoint.end());
   //    notDrawnIDs.push_back(lastCurveIndex+1);
   //    notDrawnIDs.push_back(37);
        base[0].dontDraw = true;

        // 3. tvar
        base = increaseCurveIndexes(base.size(),base);
        if(*iterations>2)baseJoint = increaseCurveIndexes(baseJoint.size(),baseJoint);
        base =  setInitPosition((rowSize * (rowSize - rowSizeBefore - 2))  + (rowSize +1) + rowSizeBefore + 1,base );
        if(*iterations>2)baseJoint = setInitPosition(((rowSize/2)+1)*rowSize + rowSizeBefore + 3,baseJoint );
        allWorkPoints.insert(allWorkPoints.end(),base.begin(),base.end());
        if(*iterations>2) allJoints.insert(allJoints.end(),baseJoint.begin(),baseJoint.end());
        base[0].dontDraw = true;
       // notDrawnIDs.push_back(lastCurveIndex+1);
        //notDrawnIDs.push_back(43);

        // 4. tvar
        if(*iterations>2)baseJoint = increaseCurveIndexes(baseJoint.size(),baseJoint);
        base = increaseCurveIndexes(base.size(),base);

        base = setInitPosition(rowSizeBefore+2,base );
        if(*iterations>2)baseJoint = setInitPosition(rowSizeBefore+3,baseJoint);
        allWorkPoints.insert(allWorkPoints.end(),base.begin(),base.end());
        if(*iterations>2) allJoints.insert(allJoints.end(),baseJoint.begin(),baseJoint.end());
        base[0].dontDraw = true;
        //notDrawnIDs.push_back(lastCurveIndex+1);
        //notDrawnIDs.push_back(69);

        // Nove spojeni uprostřed
         if(*iterations>1) {
        baseJoint = increaseCurveIndexes(baseJoint.size(),baseJoint);
       // baseJoint = setInitPosition(((rowSize*rowSize)/2) - rowSizeBefore*rowSizeBefore,baseJoint);
        baseJoint = setInitPosition(((rowSize*rowSize)/2) - ((rowSizeBefore/2)*rowSize) - rowSizeBefore/2 + 1,baseJoint);
        allJoints.insert(allJoints.end(),baseJoint.begin(),baseJoint.end());
         }



        // zkopirovani notDrawnIDs

        progressBar->setValue(progressBar->value()+(10 / *iterations));
        base = allWorkPoints;
        baseJoint = allJoints;
    }
    progressBar->setValue(10);



}