Ejemplo n.º 1
0
void CClassifyGrid::NotifyCCSClassified( int ix, int iy )
{
	for ( int x = MinBound( ix ); x <= MaxBound( ix ); x++ )
		for ( int y = MinBound( iy ); y <= MaxBound( iy ); y++ ) {

			bool bAllClassified = true;

			for ( int xx = MinBound( x ); xx <= MaxBound( x ) && bAllClassified; xx++ )
				for ( int yy = MinBound( y ); yy <= MaxBound( y ) && bAllClassified; yy++ ) {
					if ( InBound( xx, yy ) && CheckCCSClassified( Index( xx, yy ) ) == false ) {
						bAllClassified = false;
					}
				}

			if ( bAllClassified ) {
				RefineChunk( m_vecPointer[ Index( x, y ) ] );
			}
		}
}
Ejemplo n.º 2
0
void B9SupportAttachmentData::CenterGeometry()
{
    unsigned int t,v;
    Triangle3D* cTri = NULL;
    QVector3D MinBound(999999,999999,999999);
    QVector3D MaxBound(-999999,-9999999,-999999);
    QVector3D Center;

    for(t = 0; t < triList.size(); t++)
    {
        cTri = &triList[t];

        if(cTri->maxBound.x() > MaxBound.x())
            MaxBound.setX(cTri->maxBound.x());
        if(cTri->maxBound.y() > MaxBound.y())
            MaxBound.setY(cTri->maxBound.y());
        if(cTri->maxBound.z() > MaxBound.z())
            MaxBound.setZ(cTri->maxBound.z());

        if(cTri->minBound.x() < MinBound.x())
            MinBound.setX(cTri->minBound.x());
        if(cTri->minBound.y() < MinBound.y())
            MinBound.setY(cTri->minBound.y());
        if(cTri->minBound.z() < MinBound.z())
            MinBound.setZ(cTri->minBound.z());
    }

    Center = (MaxBound + MinBound)*0.5;

    //now we need to move all the triangles...
    for(t = 0; t < triList.size(); t++)
    {
        for(v=0;v<3;v++)
        {
            triList[t].vertex[v] -= Center;
        }
        triList[t].UpdateBounds(); // since we are moving every triangle, we need to update their bounds too.
    }
}
Ejemplo n.º 3
0
uint Wick::buildFDF (const FlameConfig& flameConfig, vector< LeadSkeleton * >& leadSkeletons, Field3D* const field )
{
  CPoint bounds[flameConfig.skeletonsNumber + 1];
  CPoint MinBound (FLT_MAX, FLT_MAX, FLT_MAX), MaxBound (-FLT_MAX, -FLT_MAX, -FLT_MAX);
  CPoint midDist, cellSpan;
  vector < CPoint * >pointsPartitionsArray[flameConfig.skeletonsNumber];
  u_char max; /* 0 -> x, 1 -> y, 2 -> z */

  /* Création du VBO */
  buildVBO();

  /*****************************************************************************/
  /* Création des points qui vont servir d'origines pour les squelettes guides */
  /*****************************************************************************/

  /* Parcours des points */
  /* La bounding box est délimitée par les points ptMax[flameConfig.skeletonsNumber] et ptMin[0] */
  getBoundingBox (bounds[flameConfig.skeletonsNumber], bounds[0]);

  /* Découpage de la bounding box en flameConfig.skeletonsNumber partitions */
  midDist = (bounds[flameConfig.skeletonsNumber] - bounds[0]) / (flameConfig.skeletonsNumber);
  cellSpan = bounds[flameConfig.skeletonsNumber] - bounds[0];

  if(midDist.x > midDist.y)
    if(midDist.x > midDist.z)
      /* Découpage en x */
      max=0;
    else
      /* Découpage en z */
      max=2;
  else
    if(midDist.y > midDist.z)
      /* Découpage en y */
      max=1;
    else
      /* Découpage en z */
      max=2;

  switch(max){
  case 0 :
    /* Découpage en x */
    for (uint i = 1; i < flameConfig.skeletonsNumber; i++){
      bounds[i] = bounds[i-1];
      bounds[i].x += midDist.x;
    }
    cellSpan.x=midDist.x;

    for (vector < Vertex >::iterator vertexIterator = m_vertexArray.begin ();
	 vertexIterator != m_vertexArray.end (); vertexIterator++)
      {
	/* Calcul du max */
	if (vertexIterator->x >= MaxBound.x)
	  MaxBound = CPoint(vertexIterator->x, vertexIterator->y, vertexIterator->z);
	/* Calcul du min */
	if (vertexIterator->x <= MinBound.x)
	  MinBound = CPoint(vertexIterator->x, vertexIterator->y, vertexIterator->z);
      }
    //       cerr << "Découpe en x" << endl;
    break;
  case 1 :
    /* Découpage en y */
    for (uint i = 1; i < flameConfig.skeletonsNumber; i++){
      bounds[i] = bounds[i-1];
      bounds[i].y += midDist.y;
    }
    cellSpan.y=midDist.y;

    for (vector < Vertex >::iterator vertexIterator = m_vertexArray.begin ();
	 vertexIterator != m_vertexArray.end (); vertexIterator++)
      {
	/* Calcul du max */
	if (vertexIterator->y >= MaxBound.y)
	  MaxBound = CPoint(vertexIterator->x, vertexIterator->y, vertexIterator->z);
	/* Calcul du min */
	if (vertexIterator->y <= MinBound.y)
	  MinBound = CPoint(vertexIterator->x, vertexIterator->y, vertexIterator->z);
      }
    //       cerr << "Découpe en y" << endl;
    break;
  case 2 :
    /* Découpage en z */
    for (uint i = 1; i < flameConfig.skeletonsNumber; i++){
      bounds[i] = bounds[i-1];
      bounds[i].z += midDist.z;
    }
    cellSpan.z=midDist.z;

    for (vector < Vertex >::iterator vertexIterator = m_vertexArray.begin ();
	 vertexIterator != m_vertexArray.end (); vertexIterator++)
      {
	/* Calcul du max */
	if (vertexIterator->z >= MaxBound.z)
	  MaxBound = CPoint(vertexIterator->x, vertexIterator->y, vertexIterator->z);
	/* Calcul du min */
	if (vertexIterator->z <= MinBound.z)
	  MinBound = CPoint(vertexIterator->x, vertexIterator->y, vertexIterator->z);
      }
    //       cerr << "Découpe en z" << endl;
    break;
  }

  //    cerr << flameConfig.skeletonsNumber << endl;
  //    for (int i = 0; i <= flameConfig.skeletonsNumber; i++)
  //      cerr << bounds[i] << endl;
  //    cerr << "CellSpan " << cellSpan << endl;

  m_boxesDisplayList=glGenLists(1);
  glNewList (m_boxesDisplayList, GL_COMPILE);
  for (uint i = 0; i < flameConfig.skeletonsNumber; i++){
    glColor3f(0.0f,i*1.0f/(float)flameConfig.skeletonsNumber,1.0f);
    CPoint bounds2 = bounds[i]+cellSpan;
    glBegin(GL_LINE_LOOP);
    glVertex3f(bounds[i].x,bounds[i].y,bounds[i].z);
    glVertex3f(bounds[i].x,bounds[i].y,bounds2.z);
    glVertex3f(bounds[i].x,bounds2.y,bounds2.z);
    glVertex3f(bounds[i].x,bounds2.y,bounds[i].z);
    glEnd();
    glBegin(GL_LINE_LOOP);
    glVertex3f(bounds2.x,bounds[i].y,bounds[i].z);
    glVertex3f(bounds2.x,bounds[i].y,bounds2.z);
    glVertex3f(bounds2.x,bounds2.y,bounds2.z);
    glVertex3f(bounds2.x,bounds2.y,bounds[i].z);
    glEnd();
    glBegin(GL_LINES);
    glVertex3f(bounds[i].x,bounds[i].y,bounds[i].z);
    glVertex3f(bounds2.x,bounds[i].y,bounds[i].z);
    glVertex3f(bounds[i].x,bounds2.y,bounds[i].z);
    glVertex3f(bounds2.x,bounds2.y,bounds[i].z);
    glVertex3f(bounds[i].x,bounds[i].y,bounds2.z);
    glVertex3f(bounds2.x,bounds[i].y,bounds2.z);
    glVertex3f(bounds[i].x,bounds2.y,bounds2.z);
    glVertex3f(bounds2.x,bounds2.y,bounds2.z);
    glEnd();
  }
  glEndList();

  /* Tri des points pour les ranger dans les partitions */
  /* Il serait possible de faire un tri par dichotomie */
  /* pour aller un peu plus vite */

  for (vector < Vertex >::iterator vertexIterator = m_vertexArray.begin ();
       vertexIterator != m_vertexArray.end (); vertexIterator++)
    for (uint i = 0; i < flameConfig.skeletonsNumber; i++){
      CPoint bounds2 = bounds[i]+cellSpan;
      if (vertexIterator->x > bounds[i].x &&
	  vertexIterator->y > bounds[i].y &&
	  vertexIterator->z > bounds[i].z &&
	  vertexIterator->x < bounds2.x &&
	  vertexIterator->y < bounds2.y &&
	  vertexIterator->z < bounds2.z)
	pointsPartitionsArray[i].push_back (new CPoint(vertexIterator->x, vertexIterator->y, vertexIterator->z));
    }

  CPoint rootMoveFactorL(2.0f,.1f,1.0f);
  float noiseMin=-.1f;
  float noiseMax=.1f;
  float noiseInc=.5f;
  /* Création des leadSkeletons */
  /* On prend simplement le barycentre de chaque partition */
  leadSkeletons.push_back (new LeadSkeleton(field, MinBound, rootMoveFactorL, flameConfig.leadLifeSpan, -1, noiseInc, noiseMin, noiseMax));

  for (uint i = 0; i < flameConfig.skeletonsNumber; i++)
    {
      CPoint barycentre;

      if (!pointsPartitionsArray[i].empty ())
 	{
	  barycentre.resetToNull ();
	  for (vector < CPoint * >::iterator pointsIterator = pointsPartitionsArray[i].begin ();
	       pointsIterator != pointsPartitionsArray[i].end (); pointsIterator++)
	    {
	      barycentre.x += (*pointsIterator)->x;
	      barycentre.y += (*pointsIterator)->y;
	      barycentre.z += (*pointsIterator)->z;
	    }
	  barycentre = barycentre / (float)pointsPartitionsArray[i].size();

	  leadSkeletons.push_back (new LeadSkeleton(field, barycentre, rootMoveFactorL, flameConfig.leadLifeSpan, 2*(i+1)/(float)(flameConfig.skeletonsNumber+1)-1, noiseInc, noiseMin, noiseMax));
 	}
      else
	cerr << "Warning ! Wick partition #" << i << " is empty" << endl;
    }
  leadSkeletons.push_back (new LeadSkeleton(field, MaxBound, rootMoveFactorL, flameConfig.leadLifeSpan, 1, noiseInc, noiseMin, noiseMax));

  /* Suppression des points */
  for (uint i = 0; i < flameConfig.skeletonsNumber; i++)
    {
      for (vector < CPoint * >::iterator pointsIterator = pointsPartitionsArray[i].begin ();
	   pointsIterator != pointsPartitionsArray[i].end (); pointsIterator++)
	delete (*pointsIterator);
      pointsPartitionsArray[i].clear();
    }
  //  buildFDF(field);
  return (max);
}