private void applyCoulombsLaw_BarnesHut() { // first find the bounds of the nodes Vector3 minVector = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue); Vector3 maxVector = new Vector3(float.MinValue, float.MinValue, float.MinValue); foreach (var node in nodes) { minVector.x = Mathf.Min(minVector.x, node.Position.x); minVector.y = Mathf.Min(minVector.y, node.Position.y); minVector.z = Mathf.Min(minVector.z, node.Position.z); maxVector.x = Mathf.Max(maxVector.x, node.Position.x); maxVector.y = Mathf.Max(maxVector.y, node.Position.y); maxVector.z = Mathf.Max(maxVector.z, node.Position.z); } float total_width = Mathf.Max(maxVector.x - minVector.x, maxVector.y - minVector.y, maxVector.z - minVector.z); BarnesHutOctree <Node> bh_tree = new BarnesHutOctree <Node>((maxVector + minVector) / 2, total_width / 2, 0.5f); foreach (var node in nodes) { bh_tree.AddObject(node); } // start iteration over nodes to apply forces foreach (var node in nodes) { foreach (var body in bh_tree.GetNearBodies(node.Position)) { if (body == node) { continue; } Vector3 delta = node.Position - body.Position; float sqrDistance = Math.Max(0.1f, delta.sqrMagnitude); Vector3 direction = delta.normalized; Vector3 force = (direction * Repulsion * body.Mass) / (sqrDistance * 0.5f); node.AddForce(force); } } }
private void applyCoulombsLaw_BarnesHut() { // first find the bounds of the nodes Vector3 minVector = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue); Vector3 maxVector = new Vector3(float.MinValue, float.MinValue, float.MinValue); foreach (var node in nodes) { minVector.x = Mathf.Min(minVector.x, node.Position.x); minVector.y = Mathf.Min(minVector.y, node.Position.y); minVector.z = Mathf.Min(minVector.z, node.Position.z); maxVector.x = Mathf.Max(maxVector.x, node.Position.x); maxVector.y = Mathf.Max(maxVector.y, node.Position.y); maxVector.z = Mathf.Max(maxVector.z, node.Position.z); } float total_width = Mathf.Max(maxVector.x - minVector.x, maxVector.y - minVector.y, maxVector.z - minVector.z); BarnesHutOctree<Node> bh_tree = new BarnesHutOctree<Node>((maxVector + minVector) / 2, total_width / 2, 0.5f); foreach (var node in nodes) { bh_tree.AddObject(node); } // start iteration over nodes to apply forces foreach (var node in nodes) { foreach (var body in bh_tree.GetNearBodies(node.Position)) { if (body == node) continue; Vector3 delta = node.Position - body.Position; float sqrDistance = Math.Max(0.1f, delta.sqrMagnitude); Vector3 direction = delta.normalized; Vector3 force = (direction * Repulsion * body.Mass) / (sqrDistance * 0.5f); node.AddForce(force); } } }