Beispiel #1
0
        //TODO INEFFICIENT
        private Vector2 GetIntersectionToBndy(Vector2 _fromPt, Vector2 _fromDir, Rect _bnd,
                                              out BndSide _bndSide)
        {
            _bndSide = BndSide.Invalid;
            var vBndCorners = new[]
            {
                _bnd.min,
                new Vector2(_bnd.xMin, _bnd.yMax),
                _bnd.max,
                new Vector2(_bnd.xMax, _bnd.yMin)
            };

            var vBndVecs = new[]
            {
                vBndCorners[1] - vBndCorners[0], //Up
                vBndCorners[2] - vBndCorners[1], //Right
                vBndCorners[3] - vBndCorners[2], //Down
                vBndCorners[0] - vBndCorners[3]  //Left
            };
            var minDist = float.PositiveInfinity;
            var intPt   = Vector2.positiveInfinity;

            for (var bEdgeIdx = 0; bEdgeIdx < 4; ++bEdgeIdx) //TODO this is inefficient
            {
                var intsct = Geom.IntersectRays(_fromDir, vBndVecs[bEdgeIdx], _fromPt, vBndCorners[bEdgeIdx]);
                //if (intsct.sqrMagnitude == float.PositiveInfinity) continue;
                var distSqr = (intsct - _fromPt).sqrMagnitude;
                if (distSqr < minDist)
                {
                    minDist  = distSqr;
                    intPt    = intsct;
                    _bndSide = (BndSide)bEdgeIdx;
                }
            }

            return(intPt);
        }