//------------------------------------------------------------------------------ // 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; }
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; }
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; }
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); }