예제 #1
0
파일: csort.c 프로젝트: adityarout/CS61B
int main (int argc, char **argv) {
  int N;
  double * values;
  char type = argc > 2 ? argv[2][0] : 'A';
  if (argc < 2) {
    fprintf (stderr, "Usage: csort SIZE [ TYPE [SEED]] \n");
    exit (1);
  }
  N = atoi (argv[1]);
  srand (argc > 3 ? atol (argv[3]) : 42);

  if (type == 'A')
    values = randomVector(N, 0.0, 1.0);
  else 
    values = randomVector(N, 1.0, 20.0);

  startTiming();
  sort (values, N);
  stopTiming();

  if (N < 20)
    printArr(values, N);
  return 0;
}
예제 #2
0
RandomSearch::Candidate RandomSearch::search(const std::vector<std::pair<float, float>>& searchSpace, const int kIterLimit)
{
    srand((unsigned)time(0));
    RandomSearch::Candidate best;
    for (int i = 0; i < kIterLimit; ++i)
    {
        RandomSearch::Candidate candidate;
        candidate.values = randomVector(searchSpace);
        candidate.cost = objectiveFunction(candidate.values);
        if (!i || candidate.cost < best.cost)
        {
            best.cost = candidate.cost;
            best.values.swap(candidate.values);
        }
    }
    return best;
}
예제 #3
0
    void runTest() {
        std::vector<G1> encoded_terms;
        randomVector(encoded_terms, m_numberElems);

        const PPZK_QueryIC<PAIRING> A(G1::random(),
                                      encoded_terms);

        std::stringstream oss;
        A.marshal_out_raw(oss);

        PPZK_QueryIC<PAIRING> B;

        std::stringstream iss(oss.str());
        checkPass(B.marshal_in_raw(iss));

        checkPass(A == B);
    }
예제 #4
0
void main ()
{
  int numValues = 100000;

  srandom (17);
  apvector<int> vector = randomVector (numValues);
  apvector<int> histogram (10, 0);

  for (int i = 0; i<numValues; i++) {
    int index = vector[i];
    histogram[index]++;
  }

  for (int i = 0; i<10; i++) {
    cout << i << "\t" << histogram[i] << endl;
  }

}
예제 #5
0
파일: main.cpp 프로젝트: mtheall/gs_math
static void
check_quaternion(generator_t &gen, distribution_t &dist)
{
  // check identity
  {
    quat      q;
    glm::quat g;

    quatIdentity(&q);
    assert(q == g);
  }

  for(size_t x = 0; x < 10000; ++x)
  {
    // check negation
    {
      quat      q = randomQuat(gen, dist);
      glm::quat g = loadQuat(q);

      assert(quatNegate(q) == -g);
    }

    // check addition
    {
      quat      q1 = randomQuat(gen, dist);
      quat      q2 = randomQuat(gen, dist);

      glm::quat g1 = loadQuat(q1);
      glm::quat g2 = loadQuat(q2);

      assert(quatAdd(q1, q2) == g1+g2);
    }

    // check subtraction
    {
      quat      q1 = randomQuat(gen, dist);
      quat      q2 = randomQuat(gen, dist);

      glm::quat g1 = loadQuat(q1);
      glm::quat g2 = loadQuat(q2);

      assert(quatSubtract(q1, q2) == g1 + (-g2));
    }

    // check scale
    {
      quat      q = randomQuat(gen, dist);
      glm::quat g = loadQuat(q);

      float f = dist(gen);

      assert(quatScale(q, f) == g*f);
    }

    // check normalize
    {
      quat      q = randomQuat(gen, dist);
      glm::quat g = loadQuat(q);

      assert(quatNormalize(q) == glm::normalize(g));
    }

    // check dot
    {
      quat      q1 = randomQuat(gen, dist);
      quat      q2 = randomQuat(gen, dist);
      glm::quat g1 = loadQuat(q1);
      glm::quat g2 = loadQuat(q2);

      assert(std::abs(quatDot(q1, q2) - glm::dot(g1, g2)) < 0.0001f);
    }

    // check conjugate
    {
      quat      q = randomQuat(gen, dist);
      glm::quat g = loadQuat(q);

      assert(quatConjugate(q) == glm::conjugate(g));
    }

    // check inverse
    {
      quat      q = randomQuat(gen, dist);
      glm::quat g = loadQuat(q);

      assert(quatInverse(q) == glm::inverse(g));
    }

    // check quaternion multiplication
    {
      quat      q1 = randomQuat(gen, dist);
      quat      q2 = randomQuat(gen, dist);
      glm::quat g1 = loadQuat(q1);
      glm::quat g2 = loadQuat(q2);

      assert(quatMultiply(q1, q2) == g1*g2);
    }

    // check vector multiplication
    {
      quat      q = randomQuat(gen, dist);
      glm::quat g = loadQuat(q);

      glm::vec3 v = randomVector(gen, dist);

      assert(quatMultiplyVec3f(q, (vec3f){ v.x, v.y, v.z }) == g*v);
    }

    // check rotation
    {
      quat      q = randomQuat(gen, dist);
      glm::quat g = loadQuat(q);

      glm::vec3 v = randomVector(gen, dist);
      float     r = randomAngle(gen, dist);

      assert(quatRotate(q, (vec3f){ v.x, v.y, v.z }, r) == glm::rotate(g, r, v));
    }

    // check rotate X
    {
      quat      q = randomQuat(gen, dist);
      glm::quat g = loadQuat(q);

      float     r = randomAngle(gen, dist);

      assert(quatRotateX(q, r) == glm::rotate(g, r, x_axis));
    }

    // check rotate Y
    {
      quat      q = randomQuat(gen, dist);
      glm::quat g = loadQuat(q);

      float     r = randomAngle(gen, dist);

      assert(quatRotateY(q, r) == glm::rotate(g, r, y_axis));
    }

    // check rotate Z
    {
      quat      q = randomQuat(gen, dist);
      glm::quat g = loadQuat(q);

      float     r = randomAngle(gen, dist);

      assert(quatRotateZ(q, r) == glm::rotate(g, r, z_axis));
    }

    // check conversion from matrix
    {
      quat      q = randomQuat(gen, dist);
      glm::quat g = loadQuat(q);

      mtx44 m;
      quatToMtx44(&m, q);

      assert(m == glm::mat4_cast(g));
    }
  }
}
예제 #6
0
파일: main.cpp 프로젝트: mtheall/gs_math
static void
check_matrix(generator_t &gen, distribution_t &dist)
{
  // check identity
  {
    mtx44 m;
    mtx44Identity(&m);
    assert(m == glm::mat4());
  }

  for(size_t x = 0; x < 10000; ++x)
  {
    // check multiply
    {
      mtx44 m1, m2;
      randomMatrix(m1, gen, dist);
      randomMatrix(m2, gen, dist);

      glm::mat4 g1 = loadMatrix(m1);
      glm::mat4 g2 = loadMatrix(m2);

      mtx44 result;
      mtx44Multiply(&result, &m1, &m2);
      assert(result == g1*g2);
    }

    // check translate
    {
      mtx44 m;
      randomMatrix(m, gen, dist);

      glm::mat4 g = loadMatrix(m);
      glm::vec3 v = randomVector(gen, dist);

      mtx44Translate(&m, v.x, v.y, v.z);
      assert(m == glm::translate(g, v));
    }

    // check scale
    {
      mtx44 m;
      randomMatrix(m, gen, dist);

      glm::mat4 g = loadMatrix(m);
      glm::vec3 v = randomVector(gen, dist);

      mtx44Scale(&m, v.x, v.y, v.z);
      assert(m == glm::scale(g, v));
    }

    // check rotate
    {
      mtx44 m;
      randomMatrix(m, gen, dist);

      float r = randomAngle(gen, dist);

      glm::mat4 g = loadMatrix(m);
      glm::vec3 v = randomVector(gen, dist);

      mtx44Rotate(&m, (vec3f){ v.x, v.y, v.z }, r);
      assert(m == glm::rotate(g, r, v));
    }

    // check rotate X
    {
      mtx44 m;
      randomMatrix(m, gen, dist);

      float r = randomAngle(gen, dist);

      glm::mat4 g = loadMatrix(m);

      mtx44RotateX(&m, r);
      assert(m == glm::rotate(g, r, x_axis));
    }

    // check rotate Y
    {
      mtx44 m;
      randomMatrix(m, gen, dist);

      float r = randomAngle(gen, dist);

      glm::mat4 g = loadMatrix(m);

      mtx44RotateY(&m, r);
      assert(m == glm::rotate(g, r, y_axis));
    }

    // check rotate Z
    {
      mtx44 m;
      randomMatrix(m, gen, dist);

      float r = randomAngle(gen, dist);

      glm::mat4 g = loadMatrix(m);

      mtx44RotateZ(&m, r);
      assert(m == glm::rotate(g, r, z_axis));
    }
  }
}
bool CadScene::loadCSF( const char* filename, int clones, int cloneaxis)
{
  CSFile* csf;
  CSFileMemoryPTR mem = CSFileMemory_new();
  if (CSFile_loadExt(&csf,filename,mem) != CADSCENEFILE_NOERROR || !(csf->fileFlags & CADSCENEFILE_FLAG_UNIQUENODES)){
    CSFileMemory_delete(mem);
    return false;
  }

  int copies = clones + 1;

  CSFile_transform(csf);

  srand(234525);

  // materials
  m_materials.resize( csf->numMaterials );
  for (int n = 0; n < csf->numMaterials; n++ )
  {
    CSFMaterial* csfmaterial = &csf->materials[n];
    Material& material = m_materials[n];

    for (int i = 0; i < 2; i++){
      material.sides[i].ambient = randomVector(0.0f,0.1f);
      material.sides[i].diffuse = nv_math::vec4f(csf->materials[n].color) + randomVector(0.0f,0.07f);
      material.sides[i].specular = randomVector(0.25f,0.55f);
      material.sides[i].emissive = randomVector(0.0f,0.05f);
    }

  }

  glGenBuffers(1,&m_materialsGL);
  glNamedBufferStorageEXT(m_materialsGL, sizeof(Material) * m_materials.size(), &m_materials[0], 0);
  //glMapNamedBufferRange(m_materialsGL, 0, sizeof(Material) * m_materials.size(), GL_MAP_PERSISTENT_BIT | GL_MAP_WRITE_BIT);

  // geometry
  int numGeoms = csf->numGeometries;
  m_geometry.resize( csf->numGeometries * copies );
  m_geometryBboxes.resize( csf->numGeometries * copies );
  for (int n = 0; n < csf->numGeometries; n++ )
  {
    CSFGeometry* csfgeom = &csf->geometries[n];
    Geometry& geom = m_geometry[n];
    
    geom.cloneIdx = -1;

    geom.numVertices = csfgeom->numVertices;
    geom.numIndexSolid = csfgeom->numIndexSolid;
    geom.numIndexWire = csfgeom->numIndexWire;

    std::vector<Vertex>   vertices( csfgeom->numVertices );
    for (int i = 0; i < csfgeom->numVertices; i++){
      vertices[i].position[0] = csfgeom->vertex[3*i + 0];
      vertices[i].position[1] = csfgeom->vertex[3*i + 1];
      vertices[i].position[2] = csfgeom->vertex[3*i + 2];
      vertices[i].position[3] = 1.0f;
      if (csfgeom->normal){
        vertices[i].normal[0] = csfgeom->normal[3*i + 0];
        vertices[i].normal[1] = csfgeom->normal[3*i + 1];
        vertices[i].normal[2] = csfgeom->normal[3*i + 2];
        vertices[i].normal[3] = 0.0f;
      }
      else{
        vertices[i].normal = normalize(nv_math::vec3f(vertices[i].position));
      }
      
      
      m_geometryBboxes[n].merge( vertices[i].position );
    }

    geom.vboSize = sizeof(Vertex) * vertices.size();

    glGenBuffers(1,&geom.vboGL);
    glNamedBufferStorageEXT(geom.vboGL,geom.vboSize, &vertices[0], 0);

    std::vector<GLuint> indices(csfgeom->numIndexSolid + csfgeom->numIndexWire);
    memcpy(&indices[0],csfgeom->indexSolid, sizeof(GLuint) * csfgeom->numIndexSolid);
    if (csfgeom->indexWire){
      memcpy(&indices[csfgeom->numIndexSolid],csfgeom->indexWire, sizeof(GLuint) * csfgeom->numIndexWire);
    }

    geom.iboSize = sizeof(GLuint) * indices.size();

    glGenBuffers(1,&geom.iboGL);
    glNamedBufferStorageEXT(geom.iboGL, geom.iboSize, &indices[0], 0);

    if (GLEW_NV_vertex_buffer_unified_memory){
      glGetNamedBufferParameterui64vNV(geom.vboGL, GL_BUFFER_GPU_ADDRESS_NV, &geom.vboADDR);
      glMakeNamedBufferResidentNV(geom.vboGL, GL_READ_ONLY);

      glGetNamedBufferParameterui64vNV(geom.iboGL, GL_BUFFER_GPU_ADDRESS_NV, &geom.iboADDR);
      glMakeNamedBufferResidentNV(geom.iboGL, GL_READ_ONLY);
    }
    
    geom.parts.resize( csfgeom->numParts );
    
    size_t offsetSolid = 0;
    size_t offsetWire = csfgeom->numIndexSolid * sizeof(GLuint);
    for (int i = 0; i < csfgeom->numParts; i++){
      geom.parts[i].indexWire.count   = csfgeom->parts[i].indexWire;
      geom.parts[i].indexSolid.count  = csfgeom->parts[i].indexSolid;

      geom.parts[i].indexWire.offset  = offsetWire;
      geom.parts[i].indexSolid.offset = offsetSolid;

      offsetWire  += csfgeom->parts[i].indexWire  * sizeof(GLuint);
      offsetSolid += csfgeom->parts[i].indexSolid * sizeof(GLuint);
    }
  }
  for (int c = 1; c <= clones; c++){
    for (int n = 0; n < numGeoms; n++ )
    {
      m_geometryBboxes[n + numGeoms * c] = m_geometryBboxes[n];

      const Geometry& geomorig  = m_geometry[n];
      Geometry& geom = m_geometry[n + numGeoms * c];

      geom = geomorig;
      
    #if 1
      geom.cloneIdx = n;
    #else
      geom.cloneIdx = -1;
      glGenBuffers(1,&geom.vboGL);
      glNamedBufferStorageEXT(geom.vboGL,geom.vboSize, 0, 0);

      glGenBuffers(1,&geom.iboGL);
      glNamedBufferStorageEXT(geom.iboGL,geom.iboSize, 0, 0);
      
      if (GLEW_NV_vertex_buffer_unified_memory){
        glGetNamedBufferParameterui64vNV(geom.vboGL, GL_BUFFER_GPU_ADDRESS_NV, &geom.vboADDR);
        glMakeNamedBufferResidentNV(geom.vboGL, GL_READ_ONLY);

        glGetNamedBufferParameterui64vNV(geom.iboGL, GL_BUFFER_GPU_ADDRESS_NV, &geom.iboADDR);
        glMakeNamedBufferResidentNV(geom.iboGL, GL_READ_ONLY);
      }

      glNamedCopyBufferSubDataEXT(geomorig.vboGL, geom.vboGL, 0, 0, geom.vboSize);
      glNamedCopyBufferSubDataEXT(geomorig.iboGL, geom.iboGL, 0, 0, geom.iboSize);
    #endif
    }
  }


  glGenBuffers(1,&m_geometryBboxesGL);
  glNamedBufferStorageEXT(m_geometryBboxesGL,sizeof(BBox) * m_geometryBboxes.size(), &m_geometryBboxes[0], 0);
  glGenTextures(1, &m_geometryBboxesTexGL);
  glTextureBufferEXT(m_geometryBboxesTexGL, GL_TEXTURE_BUFFER, GL_RGBA32F, m_geometryBboxesGL);
  
  // nodes
  int numObjects  = 0;
  m_matrices.resize( csf->numNodes * copies );

  for (int n = 0; n < csf->numNodes; n++){
    CSFNode*    csfnode  = &csf->nodes[n];

    memcpy( m_matrices[n].objectMatrix.get_value(), csfnode->objectTM, sizeof(float)*16 );
    memcpy( m_matrices[n].worldMatrix.get_value(),  csfnode->worldTM,  sizeof(float)*16 );
    
    m_matrices[n].objectMatrixIT  = nv_math::transpose( nv_math::invert(m_matrices[n].objectMatrix) );
    m_matrices[n].worldMatrixIT   = nv_math::transpose( nv_math::invert(m_matrices[n].worldMatrix) );

    if (csfnode->geometryIDX < 0) continue;
    
    numObjects++;
  }


  // objects
  m_objects.resize( numObjects * copies );
  m_objectAssigns.resize( numObjects * copies );
  numObjects = 0;
  for (int n = 0; n < csf->numNodes; n++){
    CSFNode*    csfnode  = &csf->nodes[n];

    if (csfnode->geometryIDX < 0) continue;
    
    Object& object = m_objects[numObjects];

    object.matrixIndex = n;
    object.geometryIndex = csfnode->geometryIDX;

    m_objectAssigns[numObjects] = nv_math::vec2i( object.matrixIndex, object.geometryIndex );

    object.parts.resize( csfnode->numParts );
    for (int i = 0; i < csfnode->numParts; i++){
      object.parts[i].active = 1;
      object.parts[i].matrixIndex = csfnode->parts[i].nodeIDX < 0 ? object.matrixIndex : csfnode->parts[i].nodeIDX;
      object.parts[i].materialIndex = csfnode->parts[i].materialIDX;
    }

    BBox bbox = m_geometryBboxes[object.geometryIndex].transformed( m_matrices[n].worldMatrix );
    m_bbox.merge( bbox );

    updateObjectDrawCache(object);

    numObjects++;
  }

  // compute clone move delta based on m_bbox;

  nv_math::vec4f dim = m_bbox.max - m_bbox.min;

  int sq = 1;
  int numAxis = 0;
  for (int i = 0; i < 3; i++){
    numAxis += (cloneaxis & (1<<i)) ? 1 : 0;
  }

  assert(numAxis);

  switch (numAxis)
  {
  case 1:
    sq = copies;
    break;
  case 2:
    while (sq * sq < copies){
      sq++;
    }
    break;
  case 3:
    while (sq * sq * sq < copies){
      sq++;
    }
    break;
  }
  

  for (int c = 1; c <= clones; c++){
    int numNodes = csf->numNodes;

    nv_math::vec4f shift = dim * 1.05f;

    float u = 0;
    float v = 0;
    float w = 0;

    switch (numAxis)
    {
    case 1:
      u = float(c);
      break;
    case 2:
      u = float(c % sq);
      v = float(c / sq);
      break;
    case 3:
      u = float(c % sq);
      v = float((c / sq) % sq);
      w = float( c / (sq*sq));
      break;
    }

    float use = u;

    if (cloneaxis & (1<<0)){
      shift.x *= -use;
      if (numAxis > 1 ) use = v;
    }
    else {
      shift.x = 0;
    }

    if (cloneaxis & (1<<1)){
      shift.y *= use;
      if (numAxis > 2 )       use = w;
      else if (numAxis > 1 )  use = v;
    }
    else {
      shift.y = 0;
    }

    if (cloneaxis & (1<<2)){
      shift.z *= -use;
    }
    else {
      shift.z = 0;
    }

    shift.w = 0;

    // move all world matrices
    for (int n = 0; n < numNodes; n++ )
    {
      MatrixNode &node = m_matrices[n + numNodes * c];
      MatrixNode &nodeOrig = m_matrices[n];
      node = nodeOrig;
      node.worldMatrix.set_col(3,node.worldMatrix.col(3) + shift);
      node.worldMatrixIT   = nv_math::transpose( nv_math::invert(node.worldMatrix) );
    }

    {
      // patch object matrix of root
      MatrixNode &node = m_matrices[csf->rootIDX + numNodes * c];
      node.objectMatrix.set_col(3,node.objectMatrix.col(3) + shift);
      node.objectMatrixIT  = nv_math::transpose( nv_math::invert(node.objectMatrix) );
    }
    
    // clone objects
    for (int n = 0; n < numObjects; n++ )
    {
      const Object& objectorig  = m_objects[n];
      Object& object            = m_objects[ n + numObjects * c];
      
      object = objectorig;
      object.geometryIndex      += c * numGeoms;
      object.matrixIndex        += c * numNodes;
      for (size_t i = 0; i < object.parts.size(); i++){
        object.parts[i].matrixIndex += c * numNodes;
      }
      for (size_t i = 0; i < object.cacheSolid.state.size(); i++){
        object.cacheSolid.state[i].matrixIndex += c * numNodes;
      }
      for (size_t i = 0; i < object.cacheWire.state.size(); i++){
        object.cacheWire.state[i].matrixIndex += c * numNodes;
      }

      m_objectAssigns[n + numObjects * c] = nv_math::vec2i( object.matrixIndex, object.geometryIndex );
    }

  }

  glGenBuffers(1,&m_matricesGL);
  glNamedBufferStorageEXT(m_matricesGL, sizeof(MatrixNode) * m_matrices.size(), &m_matrices[0], 0);
  //glMapNamedBufferRange(m_matricesGL, 0, sizeof(MatrixNode) * m_matrices.size(), GL_MAP_PERSISTENT_BIT | GL_MAP_WRITE_BIT);
  
  glGenTextures(1,&m_matricesTexGL);
  glTextureBufferEXT(m_matricesTexGL, GL_TEXTURE_BUFFER, GL_RGBA32F, m_matricesGL);

  glGenBuffers(1,&m_objectAssignsGL);
  glNamedBufferStorageEXT(m_objectAssignsGL,sizeof(nv_math::vec2i) * m_objectAssigns.size(), &m_objectAssigns[0], 0);

  if (GLEW_NV_vertex_buffer_unified_memory){
    glGetNamedBufferParameterui64vNV(m_materialsGL, GL_BUFFER_GPU_ADDRESS_NV, &m_materialsADDR);
    glMakeNamedBufferResidentNV(m_materialsGL, GL_READ_ONLY);

    glGetNamedBufferParameterui64vNV(m_matricesGL, GL_BUFFER_GPU_ADDRESS_NV, &m_matricesADDR);
    glMakeNamedBufferResidentNV(m_matricesGL, GL_READ_ONLY);

    if (GLEW_NV_bindless_texture){
      m_matricesTexGLADDR = glGetTextureHandleNV(m_matricesTexGL);
      glMakeTextureHandleResidentNV(m_matricesTexGLADDR);
    }
  }

  m_nodeTree.create(copies * csf->numNodes);
  for (int i = 0; i < copies; i++){
    int cloneoffset = (csf->numNodes) * i;
    int root = csf->rootIDX+cloneoffset;
    recursiveHierarchy(m_nodeTree,csf,csf->rootIDX,cloneoffset);

    m_nodeTree.setNodeParent( (NodeTree::nodeID)root, m_nodeTree.getTreeRoot() );
    m_nodeTree.addToTree( (NodeTree::nodeID)root );
  }

  glGenBuffers(1,&m_parentIDsGL);
  glNamedBufferStorageEXT(m_parentIDsGL, m_nodeTree.getTreeCompactNodes().size() * sizeof(GLuint), &m_nodeTree.getTreeCompactNodes()[0], 0);

  glGenBuffers(1,&m_matricesOrigGL);
  glNamedBufferStorageEXT(m_matricesOrigGL, sizeof(MatrixNode) * m_matrices.size(), &m_matrices[0], 0);
  glGenTextures(1,&m_matricesOrigTexGL);
  glTextureBufferEXT(m_matricesOrigTexGL, GL_TEXTURE_BUFFER, GL_RGBA32F, m_matricesOrigGL);
  
  CSFileMemory_delete(mem);
  return true;
}
예제 #8
0
Point3 ParticleSystem::initialPos() const
{
  return m_origin + memberMult(randomVector(), m_posDeviation);
}
예제 #9
0
Vector3 ParticleSystem::initialVelocity() const
{
  Vector3 vd = memberMult(randomVector(), m_velocityDeviation);
  return (m_basicVel + vd) * m_initialVelMag.random();
}
예제 #10
0
파일: dataout.cpp 프로젝트: dirmich/3dslam
void CDataOut::Disp_out(IplImage *framecopy)
{
  char ndisp[100];
  sprintf(ndisp,(resdir+"disp%d.txt").c_str(),iter++);
  DispFile.open(ndisp);
  int ii=0;
  CvMat *temp,*temp2,*temp3;
  temp=cvCreateMatHeader(6,6,CV_32FC1);
  temp2=cvCreateMat(3,6,CV_32FC1);
  temp3=cvCreateMat(3,3,CV_32FC1);
  CvMat* vect=cvCreateMat (6,1,CV_32FC1);
  CvMat* res6=cvCreateMat (6,1,CV_32FC1);
  CvMat* vect2=cvCreateMat(1,6,CV_32FC1);
  CvMat* proj = cvCreateMat(4,2,CV_32FC1);    ///NOT RELEASED
  CvMat* m = cvCreateMat(3,1,CV_32FC1);

  for ( list<CElempunto*>::iterator It=pEstimator->pMap->bbdd.begin();
	    It != pEstimator->pMap->bbdd.end(); It++ )
    {
      if((*It)->state>2)
	  {

	  cvmSet(m,0,0,cos((*It)->theta)*sin((*It)->phi));
	  cvmSet(m,1,0,-sin((*It)->theta));
	  cvmSet(m,2,0,cos((*It)->theta)*cos((*It)->phi));
	  cvNormalize( m, m);

	/*  float xreal=(*It)->wx +cvmGet(m,0,0)/(*It)->rho;
	  float yreal=(*It)->wy +cvmGet(m,1,0)/(*It)->rho;
	  float zreal=(*It)->wz +cvmGet(m,2,0)/(*It)->rho;
*/
    CvMat *pCovMat = pEstimator->getCovMat();

	  if (12+ii*6< pCovMat->width && 12+ii*6< pCovMat->height)
	    {

	      cvGetSubRect( pCovMat,temp,cvRect(12+ii*6,12+ii*6,6,6) );

        for (int part=0; part<40; part++){
		  cvmSet(vect,0,0,randomVector(-.005,.005));
  		  cvmSet(vect,1,0,randomVector(-.005,.005));
  		  cvmSet(vect,2,0,randomVector(-.005,.005));
		  cvmSet(vect,3,0,randomVector(-.005,0.005));
		  cvmSet(vect,4,0,randomVector(-.005,0.005));
		  cvmSet(vect,5,0,randomVector(-1,1));

          cvMatMul(temp,vect,res6);

          cvmSet(m,0,0,cos(cvmGet(res6,3,0)+(*It)->theta)*sin(cvmGet(res6,4,0)+(*It)->phi));
  		  cvmSet(m,1,0,-sin(cvmGet(res6,3,0)+(*It)->theta));
  		  cvmSet(m,2,0,cos(cvmGet(res6,3,0)+(*It)->theta)*cos(cvmGet(res6,4,0)+(*It)->phi));
    	  cvNormalize( m, m);
    	  cvmSet (vect2,0,0,((cvmGet(res6,0,0)+(*It)->wx)+cvmGet(m,0,0)/(cvmGet(res6,5,0)+(*It)->rho)));
    	  cvmSet(vect2,0,1,((cvmGet(res6,1,0)+(*It)->wy)+cvmGet(m,1,0)/(cvmGet(res6,5,0)+(*It)->rho)));
   	  cvmSet(vect2,0,2,((cvmGet(res6,2,0)+(*It)->wz)+cvmGet(m,2,0)/(cvmGet(res6,5,0)+(*It)->rho)));

        DispFile<<cvmGet(vect2,0,0)<<" ";
        DispFile<<cvmGet(vect2,0,1)<<" ";
        DispFile<<cvmGet(vect2,0,2)<<" ";
        DispFile<<ii<<endl;
          cvmSet(vect2,0,0,cvmGet(res6,0,0)+(*It)->wx);
          cvmSet(vect2,0,1,cvmGet(res6,1,0)+(*It)->wy);
          cvmSet(vect2,0,2,cvmGet(res6,2,0)+(*It)->wz);
          cvmSet(vect2,0,3,cvmGet(res6,3,0)+(*It)->theta);
          cvmSet(vect2,0,4,cvmGet(res6,4,0)+(*It)->phi);
          cvmSet(vect2,0,5,cvmGet(res6,5,0)+(*It)->rho);

             pModelCam->cvProject_1_pto(vect2,proj,NULL,NULL,NULL);
             if (framecopy != NULL){
    		   cvCircle (framecopy,cvPoint((int)cvmGet(proj,0,0),(int)cvmGet(proj,0,1)),1,cvScalar(0,0,255),1 );
             }
   	      }

	    }
	  }
      ii++;
    }
    cvReleaseMatHeader(&temp);
    cvReleaseMat(&temp2);
    cvReleaseMat(&temp3);
    cvReleaseMat(&vect);
    cvReleaseMat(&vect2);
    cvReleaseMat(&res6);
    cvReleaseMat(&proj);
    DispFile.close();
}