/* * Create nested grid vorticity influence tree. * * Each layer of this tree represents a simplified, aggregated version of * all of the information in its "child" layer, where each * "child" has higher resolution than its "parent". * * Derivation: * * Using conservation properties, I_0 = I_0' , I_1 = I_1' , I_2 = I_2' * * I_0 : wx d = w1x d1 + w2x d2 * : wy d = w1y d1 + w2y d2 * : wz d = w1z d1 + w2z d2 * * These 3 are not linearly independent: * I_1 : ( y wz - z wy ) d = ( y1 wz1 - z1 wy1 ) d1 + ( y2 wz2 - z2 wy2 ) d2 * : ( z wx - x wz ) d = ( z1 wx1 - x1 wz1 ) d1 + ( z2 wx2 - x2 wz2 ) d2 * : ( x wy - y wx ) d = ( x1 wy1 - y1 wx1 ) d1 + ( x2 wy2 - y2 wx2 ) d2 * * I_2 : ( x^2 + y^2 + z^2 ) wx d = (x1^2 + y1^2 + z1^2 ) wx1 d1 + ( x2^2 + y2^2 + z2^2 ) wx2 d2 * : ( x^2 + y^2 + z^2 ) wy d = (x1^2 + y1^2 + z1^2 ) wy1 d1 + ( x2^2 + y2^2 + z2^2 ) wy2 d2 * : ( x^2 + y^2 + z^2 ) wz d = (x1^2 + y1^2 + z1^2 ) wz1 d1 + ( x2^2 + y2^2 + z2^2 ) wz2 d2 * * Can replace I_2 with its magnitude: * ( x^2 + y^2 + z^2 ) ( wx^2 + wy^2 + wz^2 )^(1/2) d * = ( x1^2 + y1^2 + z1^2 ) ( wx1^2 + w1y^2 + w1z^2 )^(1/2) d1 + ( x2^2 + y2^2 + z2^2 ) ( wx2^2 + w2y^2 + w2z^2 )^(1/2) d2 */ void CreateInfluenceTree() { FindBoundingBox(); // Find axis-aligned bounding box that encloses all vortons and tracers. // Create skeletal nested grid for influence tree. float numElements; int numVortons = mVortons.Count; numElements = numVortons; // Default approach. Loss of precission when adding tracers... but fast. //float boundingBoxVolume = (mMaxCorner - mMinCorner).x * (mMaxCorner - mMinCorner).y * (mMaxCorner - mMinCorner).z; //float vortonVolume = 4 * (1.0f / 3.0f) * Mathf.PI * // (mVortons[0].radius * mVortons[0].radius * mVortons[0].radius); ////Accurate approach that maintains precission.Very Slow. //numElements = boundingBoxVolume / vortonVolume; { UniformGrid <Vorton> ugSkeleton = new UniformGrid <Vorton>(); ///< Uniform grid with the same size & shape as the one holding aggregated information about mVortons. ugSkeleton.DefineShape((uint)numElements, mMinCorner, mMaxCorner, true); mInfluenceTree.Initialize(ugSkeleton); // Create skeleton of influence tree. } MakeBaseVortonGrid(); int numLayers = mInfluenceTree.GetDepth(); for (uint uParentLayer = 1; uParentLayer < numLayers; ++uParentLayer) { // For each layer in the influence tree... AggregateClusters(uParentLayer); } }