void DynamicBubble(triangulateio &in,triangulateio &mid,REAL *Velocity) { int a[100][50]={{0}}; for(int i=0;i<mid.numberoftriangles;i++) { AddPoint(a[mid.trianglelist[3*i]],mid.trianglelist[3*i+1]); AddPoint(a[mid.trianglelist[3*i]],mid.trianglelist[3*i+2]); AddPoint(a[mid.trianglelist[3*i+1]],mid.trianglelist[3*i]); AddPoint(a[mid.trianglelist[3*i+1]],mid.trianglelist[3*i+2]); AddPoint(a[mid.trianglelist[3*i+2]],mid.trianglelist[3*i]); AddPoint(a[mid.trianglelist[3*i+2]],mid.trianglelist[3*i+1]); } for(int i=0;i<mid.numberofpoints;i++) { int flag=-1; REAL fx=0,fy=0; REAL xi,yi,ri; xi=mid.pointlist[2*i]; yi=mid.pointlist[2*i+1]; ri=mid.pointattributelist[i]; for(int j=1;j<=a[i][0];j++) //for(int j=0;j<mid.numberofpoints;j++) { // if(j==i)continue; REAL xj,yj,rj; xj=mid.pointlist[2*a[i][j]]; yj=mid.pointlist[2*a[i][j]+1]; rj=mid.pointattributelist[a[i][j]]; REAL Lij=GetPlateauEqual(ri,rj); if(IsStable(xi,yi,ri,xj,yj,rj)) { flag=a[i][j]; Velocity[2*flag]=0; Velocity[2*flag+1]=0; } fx=fx+GetSpring(xi,xj,Lij); fy=fy+GetSpring(yi,yj,Lij); } if (flag!=-1) { fx=0; fy=0; Velocity[2*i]=0; Velocity[2*i+1]=0; } REAL accX=fx/0.1; REAL accY=fy/0.1; REAL sx=Velocity[2*i]*Pertime+(1/2.0)*accX*pow(Pertime,2.0); REAL sy=Velocity[2*i+1]*Pertime+(1/2.0)*accY*pow(Pertime,2.0); in.pointlist[2*i]=in.pointlist[2*i]+sx; in.pointlist[2*i+1]=in.pointlist[2*i+1]+sy; Velocity[2*i]=Velocity[2*i]+accX*Pertime; Velocity[2*i+1]=Velocity[2*i+1]+accY*Pertime; } }
int SpringSystem::CreateSpring(int particleId1, int particleId2) { Spring* spr = GetSpring(particleId1, particleId2); if (spr) { std::cout << "CreateSpring: found duplicate spring.\n"; return spr->GetId(); } int n = m_springs.size(); spr = new Spring(n, GetParticle(particleId1), GetParticle(particleId2)); m_springs.push_back(spr); // Add this spring to the map of springs connected to each particle m_springMap[particleId1].insert(spr); m_springMap[particleId2].insert(spr); // We have just set the natural length of the spring. // Set the min and max lengths based on this. // TODO This is a property of the squishy thing float natLen = spr->GetNaturalLength(); // TODO TEMP TEST spr->SetMaxLength(natLen * 1.5f); spr->SetMinLength(natLen * 0.7f); return n; }
bool SpringSystem::EraseSpring(int particleId1, int particleId2) { Spring* spr = GetSpring(particleId1, particleId2); if (spr) { m_springs.erase(std::remove(m_springs.begin(), m_springs.end(), spr), m_springs.end()); m_springMap[particleId1].erase(spr); m_springMap[particleId2].erase(spr); return true; } return false; }