/** * @brief Tests the sending and receiving of information through streams. */ void SearchResultTester::testStreamMethods() { QList<SearchResultElement> list; SearchResult s(list); SearchResultElement element1; element1.setScore(2); SearchResultElement element2; element2.setScore(4); s.addResultElement(element1); s.addResultElement(element2); QFile file("file.dat"); file.open(QIODevice::WriteOnly); QDataStream out(&file); out << s; file.close(); file.open(QIODevice::ReadOnly); QDataStream in(&file); SearchResult newS(list); in >> newS; file.close(); QCOMPARE(s.getSearchResultList().takeFirst().getScore(), newS.getSearchResultList().takeFirst().getScore()); QCOMPARE(s.getSearchResultList().takeLast().getScore(), newS.getSearchResultList().takeLast().getScore()); }
//Addition operator UtlString operator+(const char* szStr, const UtlString& str) { UtlString newS(szStr); newS.append(str); return newS; }
Actor* Parser::parseMesh(xml_node_iterator sceneElement) { // setting the mesh const char* filename = sceneElement->attribute("file").value(); TriangleMesh* mesh = MeshReader().execute(filename); Primitive* primitive = new TriangleMeshShape(mesh); xml_node op; if ((op = sceneElement->child("transform")) != NULL) { vec3 position(0, 0, 0); quat q(vec3(0, 0, 0)); vec3 scale(1, 1, 1); float x, y, z; xml_object_range<xml_node_iterator> transformations = op.children(); for (xml_node_iterator transformation = transformations.begin(); transformation != transformations.end(); ++transformation) { if (strcmp(transformation->name(), "position") == 0) { const char * stringTranslation = transformation->text().as_string(); sscanf(stringTranslation, "%f %f %f", &x, &y, &z); vec3 translationVec(x, y, z); position = translationVec; } else if (strcmp(transformation->name(), "scale") == 0) { float s_ = transformation->text().as_float(); vec3 newS(s_, s_, s_); scale = newS; } else if (strcmp(transformation->name(), "rotation") == 0) { float angle = transformation->child("angle").text().as_float(); const char * _Axis = transformation->child("axis").text().as_string(); sscanf(_Axis, "%f %f %f", &x, &y, &z); vec3 axis(x, y, z); q = quat(axis, angle); } mesh->transform(mat4::TRS(position, q, scale)); } } if ((op = sceneElement->child("material")) != NULL) { Material * material = parseMaterial(op); primitive->setMaterial(material); } else { Material * material = MaterialFactory::New(); primitive->setMaterial(material->getDefault()); } Actor* act = new Actor(*primitive); act->setName(filename); return act; }
Actor* Parser::parseSphere(xml_node_iterator sceneElement) { // default values vec3 center(0, 0, 0); REAL radius = 1.0; int meridians = 16; // opt values xml_node op; op = sceneElement->child("center"); REAL x, y, z; if (op != NULL) { const char* center_vector = op.text().as_string(); sscanf(center_vector, "%f %f %f", &x, &y, &z); center.set(x, y, z); } op = sceneElement->child("radius"); if (op != NULL) radius = op.text().as_float(); op = sceneElement->child("meridians"); if (op != NULL) meridians = op.text().as_int(); // now, lets make the mesh of Sphere TriangleMesh* sphereMesh = MeshSweeper::makeSphere(center, radius, meridians); Primitive* primitive = new TriangleMeshShape(sphereMesh); if ((op = sceneElement->child("transform")) != NULL) { vec3 position(0, 0, 0); quat q(vec3(0, 0, 0)); vec3 scale(1, 1, 1); float x, y, z; xml_object_range<xml_node_iterator> transformations = op.children(); for (xml_node_iterator transformation = transformations.begin(); transformation != transformations.end(); ++transformation) { if (strcmp(transformation->name(), "position") == 0) { const char * stringTranslation = transformation->text().as_string(); sscanf(stringTranslation, "%f %f %f", &x, &y, &z); vec3 translationVec(x, y, z); position = translationVec; } else if (strcmp(transformation->name(), "scale") == 0) { float s_ = transformation->text().as_float(); vec3 newS(s_, s_, s_); scale = newS; } else if (strcmp(transformation->name(), "rotation") == 0) { float angle = transformation->child("angle").text().as_float(); const char * _Axis = transformation->child("axis").text().as_string(); sscanf(_Axis, "%f %f %f", &x, &y, &z); vec3 axis(x, y, z); q = quat(axis, angle); } sphereMesh->transform(mat4::TRS(position, q, scale)); } } if ((op = sceneElement->child("material")) != NULL) { Material * material = parseMaterial(op); primitive->setMaterial(material); } else { Material * material = MaterialFactory::New(); primitive->setMaterial(material->getDefault()); } Actor* act = new Actor(*primitive); act->setName("sphere"); return act; }
// Cria os codigos de cada simbolo de acordo com Shannon-Fano void makeCodes(vector<Symbol> & s) { double x = 0, w = 0, a =0; short i = 0, j = 0, z = 0; for (short i = 0; i < s.size(); i++) // Calcula a quantidade total de simbolos z+= s[i].getOcorrence(); for (short i = 0; i < s.size(); i++) s[i].calculateProbability(z); do // Atribui o codigo zero aos simbolos do lado esquerdo da arvore { x += s[i].getProbability(); s[i].addCharCode('0'); i++; w = x + s[i].getProbability(); }while (w < 0.5); // Calcula a diferença de probabilidade das partes da arvore w = abs(0.5 - w); x = abs(0.5 - x); a = abs(w - x); if (!((a < std::numeric_limits<double>::epsilon())&&(a!=0))&&(w < x)) // Neste caso é melhor pegar o proximo elemento // (sua probabilidade fica mais equilibrada com a do outro lado da arvore) { s[i].addCharCode('0'); i++; } j = i; while (i < s.size()) // Atribui o codigo um aos simbolos do lado direito da arvore { s[i].addCharCode('1'); i++; } // Separa o vector de simbolos em duas partes a depender da probabilidade dos mesmos vector<Symbol> newS (s.begin(),s.begin()+j); vector<Symbol> newS1 (s.begin()+j,s.end()); // (s.begin()+j+1 se for no windows) if (j > 1) // Neste caso existem mais do que um elementos do lado esquerdo, logo é necessario expandir ambos os lados da arvore { makeCodes(newS); makeCodes(newS1); } else if (i > 2) // Neste caso existe mais do que dois elementos do lado direito, logo so é necessario expandir o lado direito da arvore makeCodes(newS1); for (int y = 0; y < s.size(); y++) // Atribui o codigo dos simbolos de acordo com a posição dos mesmos na arvore if (y < j) s[y].setCode(newS[y].getCode()); else s[y].setCode(newS1[y-j].getCode()); }