Пример #1
0
void TetrahedronSystem::getPointTetrahedronConnection(VicinityMap * vertTetConn)
{
	unsigned i;
	unsigned *ind = hostTetrahedronIndices();
	const unsigned nt = numTetrahedrons();
	for(i=0; i<nt; i++) {
		vertTetConn[ind[0]][i] = 1;
		vertTetConn[ind[1]][i] = 1;
		vertTetConn[ind[2]][i] = 1;
		vertTetConn[ind[3]][i] = 1;
		ind += 4;
	}
}
Пример #2
0
void TetrahedronSystem::getTehrahedronTehrahedronConnectionL1(VicinityMap * tetTetConn, 
															VicinityMap * vertTetConn)
{
	unsigned i, j;
	unsigned *ind = hostTetrahedronIndices();
	const unsigned nt = numTetrahedrons();
	for(i=0; i<nt; i++) {
		for(j=0; j<4; j++) {
			VicinityMapIter itvert = vertTetConn[ind[i*4 + j]].begin();
			for(; itvert != vertTetConn[ind[i*4 + j]].end(); ++itvert) {
				tetTetConn[itvert->first][i] = 1;
			}
		}
	}
}
Пример #3
0
void TetrahedronSystem::calculateMass()
{
	const unsigned np = numPoints();
	const unsigned nt = numTetrahedrons();
	const float density = totalMass() / totalInitialVolume();
    const float base = 1.f/(float)np;
    unsigned i;
    float * mass = hostMass();
    for(i=0; i< np; i++) {
		if(isAnchoredPoint(i))
			mass[i] = 1e9f;
        else
			mass[i] = base;
    }
    
    Vector3F * p = (Vector3F *)hostXi();
    
    Vector3F v[4];
    unsigned a, b, c, d;
    unsigned *ind = hostTetrahedronIndices();
    float m;
    for(i=0; i<nt; i++) {
		a = ind[0];
		b = ind[1];
		c = ind[2];
		d = ind[3];
		
		v[0] = p[a];
		v[1] = p[b];
		v[2] = p[c];
		v[3] = p[d];
		
		m = density * tetrahedronVolume(v) * .25f;
		
		mass[a] += m;
		mass[b] += m;
		mass[c] += m;
		mass[d] += m;
		
		ind += 4;
	}
	/*
	for(i=0; i< m_numPoints; i++) {
	    std::cout<<" m "<<mass[i];
    }
    */
}
Пример #4
0
float TetrahedronSystem::totalInitialVolume()
{
	const unsigned n = numTetrahedrons();
	Vector3F * p = (Vector3F *)hostXi();
    unsigned * v = hostTetrahedronIndices();
    unsigned i;
	Vector3F t[4];
	unsigned a, b, c, d;
	float sum = 0.f;
	for(i=0; i<n; i++) {
		a = v[0];
		b = v[1];
		c = v[2];
		d = v[3];
		t[0] = p[a];
		t[1] = p[b];
		t[2] = p[c];
		t[3] = p[d];
		sum += tetrahedronVolume(t);
        v+= 4;
	}
	return sum;
}
Пример #5
0
TriangleSystem::TriangleSystem(ATriangleMesh * md) 
{    
    const unsigned np = md->numPoints();
    
    create(md->numTriangles(), md->numTriangles(), np);
    
    Vector3F * p = md->points();
    Vector3F * q = (Vector3F *)hostX();
    unsigned i = 0;
    for(;i<np;i++) q[i] = p[i];
    
    Vector3F * qi = (Vector3F *)hostXi();
    for(i=0;i<np;i++) qi[i] = q[i];
    
    Vector3F * vel = (Vector3F *)hostV();
    for(i=0;i<np;i++) vel[i].setZero();
    
    unsigned * ind = (unsigned *)md->indices();
    unsigned * tris = hostTriangleIndices();
    for(i=0; i< md->numIndices(); i++)
        tris[i] = ind[i];
    
    unsigned * tetra = hostTetrahedronIndices();
    for(i=0; i< md->numTriangles(); i++) {
        tetra[i*4] = ind[i*3];
        tetra[i*4+1] = ind[i*3+1];
        tetra[i*4+2] = ind[i*3+2];
        tetra[i*4+3] = tetra[i*4+2];
    }
    
    float * mass = hostMass();
    for(i=0;i<np;i++) mass[i] = 1e20f;
	
	setNumPoints(np);
	setNumTetrahedrons(md->numTriangles());
	setNumTriangles(md->numTriangles());
}