Exemplo n.º 1
0
        private XVector3 BisectionSearch(XVector3 origin, XVector3 end, float min, float max)
        {
            float    mid    = (min + max) / 2;
            XVector3 newEnd = end + mid * XVector3.Normalize(end - origin);
            float    minDot = float.MaxValue;

            for (int i = 0; i < _verts.Length; i++)
            {
                float dot = XVector3.Dot(XVector3.Normalize(origin - newEnd), XVector3.Normalize(_verts[i] - newEnd));
                if (dot < -_Epsilon)
                {
                    return(BisectionSearch(origin, end, mid, max));
                }
                if (minDot > dot)
                {
                    minDot = dot;
                }
            }

            if (minDot > _Epsilon)
            {
                return(BisectionSearch(origin, end, min, mid));
            }
            return(newEnd);
        }
Exemplo n.º 2
0
        private void GetReferencePoint()
        {
            bool  assigned = false;
            float min      = float.MaxValue;

            for (int i = 0; i < _verts.Length; i++)
            {
                int j  = (i + 1) % _verts.Length;
                int k  = (i + 2) % _verts.Length;
                int l  = (i + 3) % _verts.Length;
                var ji = XVector3.Normalize(_verts[i] - _verts[j]);
                var jk = XVector3.Normalize(_verts[k] - _verts[j]);
                var ij = XVector3.Normalize(_verts[j] - _verts[i]);
                var il = XVector3.Normalize(_verts[l] - _verts[i]);
                var kj = XVector3.Normalize(_verts[j] - _verts[k]);
                var kl = XVector3.Normalize(_verts[l] - _verts[k]);

                float nextDot = XVector3.Dot(kj, kl);
                float dot     = XVector3.Dot(ji, jk);
                float prevDot = XVector3.Dot(ij, il);
                if (dot > -_Epsilon && min > dot && (prevDot > -_Epsilon || nextDot > -_Epsilon))
                {
                    assigned = true;
                    Start    = _verts[j];
                    Corner   = _verts[k];
                    min      = dot;
                }
            }
            if (!assigned)
            {
                Start  = _verts[0];
                Corner = _verts[1];
            }
        }
Exemplo n.º 3
0
        private int ExponentialSearch(XVector3 origin, XVector3 end, int step = 0)
        {
            var newEnd = end + Exp(step) * XVector3.Normalize(end - origin);

            for (int i = 0; i < _verts.Length; i++)
            {
                float dot = XVector3.Dot(XVector3.Normalize(origin - newEnd), XVector3.Normalize(_verts[i] - newEnd));
                if (dot < 0)
                {
                    return(ExponentialSearch(origin, end, step + 1));
                }
            }
            return(step);
        }