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