/*! \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); } */ }
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; }
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]); } }