Exemplo n.º 1
0
        public RetrievedPhotons RetrieveNearestNeighbors(PhotonVector3 point, float distanceSquared, int maxPhotons, Vector3 normal)
        {
            RetrievedPhotons _retrieved = new RetrievedPhotons(maxPhotons);

            LocatePhotons(root, point, distanceSquared, ref _retrieved, normal);

            return(_retrieved);
        }
Exemplo n.º 2
0
        public void LocatePhotons(Node <CompressedPhoton> node, PhotonVector3 _p, float _distSquared, ref RetrievedPhotons _retrieved, Vector3 normal)
        {
            if (node == null)
            {
                return;
            }
            // Step 1: Check distance between current node and point. If it's within radius, add it.
            PhotonVector3 difference = node.Current.position - _p;
            float         dist2      = difference[0] * difference[0];

            dist2 += difference[1] * difference[1];
            dist2 += difference[2] * difference[2];

            if (dist2 < _distSquared)
            {
                if ((node.Current != null) && (Vector3.Dot(node.Current.Direction, normal) < 0))
                {
                    _retrieved.AddIfClosest(node.Current, dist2);
                }
            }

            // Step 2: Is the point greater or lesser than the current node? Go left or right depending.
            if (difference[node.Axis] >= 0)
            {
                LocatePhotons(node.Right, _p, _distSquared, ref _retrieved, normal);
                if (difference[node.Axis] * difference[node.Axis] < _distSquared)
                {
                    LocatePhotons(node.Left, _p, _distSquared, ref _retrieved, normal);
                }
            }
            else
            {
                LocatePhotons(node.Left, _p, _distSquared, ref _retrieved, normal);
                if (difference[node.Axis] * difference[node.Axis] < _distSquared)
                {
                    LocatePhotons(node.Right, _p, _distSquared, ref _retrieved, normal);
                }
            }
        }