예제 #1
0
파일: convex.cpp 프로젝트: Ricku34/ODE.js
/*! \brief Populates the edges set, should be called only once whenever
  the polygon array gets updated */
void dxConvex::FillEdges()
{
  unsigned int *points_in_poly=polygons;
  unsigned int *index=polygons+1;
  for(unsigned int i=0;i<planecount;++i)
    {
      //fprintf(stdout,"Points in Poly: %d\n",*points_in_poly);
      for(int j=0;j<*points_in_poly;++j)
	{
	  edges.insert(edge(dMIN(index[j],index[(j+1)%*points_in_poly]),
			    dMAX(index[j],index[(j+1)%*points_in_poly])));
	  //fprintf(stdout,"Insert %d-%d\n",index[j],index[(j+1)%*points_in_poly]);
	}
      points_in_poly+=(*points_in_poly+1);
      index=points_in_poly+1;
    }
  /*
    fprintf(stdout,"Edge Count: %d\n",edges.size());
    for(std::set<edge>::iterator it=edges.begin();
    it!=edges.end();
    ++it)
    {
    fprintf(stdout,"Edge: %d-%d\n",it->first,it->second);
    }
  */
}
예제 #2
0
void dxCylinder::computeAABB()
{
    const dMatrix3& R = final_posr->R;
    const dVector3& pos = final_posr->pos;

    dReal dOneMinusR2Square = (dReal)(REAL(1.0) - R[2]*R[2]);
    dReal xrange = dFabs(R[2]*lz*REAL(0.5)) + radius * dSqrt(dMAX(REAL(0.0), dOneMinusR2Square));
    dReal dOneMinusR6Square = (dReal)(REAL(1.0) - R[6]*R[6]);
    dReal yrange = dFabs(R[6]*lz*REAL(0.5)) + radius * dSqrt(dMAX(REAL(0.0), dOneMinusR6Square));
    dReal dOneMinusR10Square = (dReal)(REAL(1.0) - R[10]*R[10]);
    dReal zrange = dFabs(R[10]*lz*REAL(0.5)) + radius * dSqrt(dMAX(REAL(0.0), dOneMinusR10Square));

    aabb[0] = pos[0] - xrange;
    aabb[1] = pos[0] + xrange;
    aabb[2] = pos[1] - yrange;
    aabb[3] = pos[1] + yrange;
    aabb[4] = pos[2] - zrange;
    aabb[5] = pos[2] + zrange;
}
예제 #3
0
파일: convex.cpp 프로젝트: Ricku34/ODE.js
void dxConvex::computeAABB()
{
  // this can, and should be optimized
  dVector3 point;
  dMULTIPLY0_331 (point,final_posr->R,points);
  aabb[0] = point[0]+final_posr->pos[0];
  aabb[1] = point[0]+final_posr->pos[0];
  aabb[2] = point[1]+final_posr->pos[1];
  aabb[3] = point[1]+final_posr->pos[1];
  aabb[4] = point[2]+final_posr->pos[2];
  aabb[5] = point[2]+final_posr->pos[2];
  for(unsigned int i=3;i<(pointcount*3);i+=3)
    {
      dMULTIPLY0_331 (point,final_posr->R,&points[i]);
      aabb[0] = dMIN(aabb[0],point[0]+final_posr->pos[0]);
      aabb[1] = dMAX(aabb[1],point[0]+final_posr->pos[0]);
      aabb[2] = dMIN(aabb[2],point[1]+final_posr->pos[1]);
      aabb[3] = dMAX(aabb[3],point[1]+final_posr->pos[1]);
      aabb[4] = dMIN(aabb[4],point[2]+final_posr->pos[2]);
      aabb[5] = dMAX(aabb[5],point[2]+final_posr->pos[2]);
    }
}