Example #1
0
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;
	}
}
Example #2
0
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;
}
Example #3
0
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;
}