void Prism::calculateCenter() { double V1 = tetrahedronVolume(vertex[0], vertex[1], vertex[2], vertex[3]); V3d c1 = tetrahedronCenter(vertex[0], vertex[1], vertex[2], vertex[3]); double V2 = tetrahedronVolume(vertex[1], vertex[3], vertex[4], vertex[5]); V3d c2 = tetrahedronCenter(vertex[1], vertex[3], vertex[4], vertex[5]); double V3 = tetrahedronVolume(vertex[1], vertex[2], vertex[3], vertex[5]); V3d c3 = tetrahedronCenter(vertex[1], vertex[2], vertex[3], vertex[5]); center = (c1 * V1 + c2 * V2 + c3 * V3) / (V1 + V2 + V3); }
float DirectionHistogram::totalVolume() const { float volume = 0.0f; for (int i = 0; i < m_meshIndex.size(); i += 4) { const int i0 = m_meshIndex[i]; const int i1 = m_meshIndex[i + 1]; const int i2 = m_meshIndex[i + 2]; const int i3 = m_meshIndex[i + 3]; const Vector3& v0 = m_meshVertex[i0] * m_bucket[i0] * m_invArea[i0]; const Vector3& v1 = m_meshVertex[i1] * m_bucket[i1] * m_invArea[i1]; const Vector3& v2 = m_meshVertex[i2] * m_bucket[i2] * m_invArea[i2]; const Vector3& v3 = m_meshVertex[i3] * m_bucket[i3] * m_invArea[i3]; volume += tetrahedronVolume(v0, v1, v2); volume += tetrahedronVolume(v0, v2, v3); } return volume; }
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]; } */ }
float ATetrahedronMesh::calculateVolume() const { Vector3F * p = points(); unsigned * v = indices(); const unsigned n = numTetrahedrons(); float sum = 0.f; Vector3F q[4]; unsigned i = 0; for(;i<n;i++) { q[0] = p[v[0]]; q[1] = p[v[1]]; q[2] = p[v[2]]; q[3] = p[v[3]]; sum+=tetrahedronVolume(q); v+=4; } return sum; }
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; }
void Tetrahedron::calculateVolume() { V = tetrahedronVolume(vertex[0], vertex[1], vertex[2], vertex[3]); }
void Prism::calculateVolume() { V = tetrahedronVolume(vertex[0], vertex[1], vertex[2], vertex[3]) + tetrahedronVolume(vertex[1], vertex[3], vertex[4], vertex[5]) + tetrahedronVolume(vertex[1], vertex[2], vertex[3], vertex[5]); }