Exemple #1
0
        /// <summary>
        /// Retrieve the perpendicular angle to this line.
        /// </summary>
        /// <param name="angle">The angle you want the perpendicular angle to face.</param>
        /// <returns>The perpendicular angle relative to the angle given.</returns>
        public float PerpendicularAngle(float angle)
        {
            var d = (End - Start);
            var a = Mathf.Angle(new Vector2(-d.Y, d.X), new Vector2(d.Y, -d.X));

            return((Mathf.AngleDifference(a, angle) <= Mathf.PiOver2) ? a : (a + Mathf.Pi));
        }
Exemple #2
0
        public float ReflectionAngle(float angle, float perpendicularAngle)
        {
            float reflectionAngle = perpendicularAngle,
                  angleDif        = Mathf.AngleDifference(angle, MathHelper.WrapAngle(perpendicularAngle + Mathf.Pi));
            float b;

            if (Mathf.AngleDifference((b = (perpendicularAngle + angleDif)), MathHelper.WrapAngle(angle + Mathf.Pi)) <= Mathf.PiOver1024)
            {
                reflectionAngle -= angleDif;
            }
            else
            {
                reflectionAngle = b;
            }
            return(reflectionAngle);
        }
Exemple #3
0
        public void AddOccluder(Line line)
        {
            _occluders.Add(line);
            if (!(((Vector2.Distance(line.Start, Position) <= Radius) || (Vector2.Distance(line.End, Position) <= Radius)) || line.Intersects(_segments[0].Line) || line.Intersects(_segments[1].Line) || line.Intersects(_segments[2].Line) || line.Intersects(_segments[3].Line)))
            {
                return;
            }
            if (_fov != 0)
            {
                var     fov = (_fov / 2);
                bool    iS4b = false, iS5b = false;
                Vector2 iS4i = Vector2.Zero, iS5i = Vector2.Zero;
                if (iS4b = _segments[4].Line.Intersects(line, ref iS4i))
                {
                    Mathf.Move(ref iS4i, Angle, -Lighting.PxOffset);
                    _segments[4].Line.End = iS4i;
                }
                if (iS5b = _segments[5].Line.Intersects(line, ref iS5i))
                {
                    Mathf.Move(ref iS5i, Angle, -Lighting.PxOffset);
                    _segments[5].Line.End = iS5i;
                }
                if (!(((Mathf.AngleDifference(Mathf.Angle(Position, line.Start), Angle) <= fov) || (Mathf.AngleDifference(Mathf.Angle(Position, line.End), Angle) <= fov)) ||
                      iS4b || iS5b))
                {
                    return;
                }
            }
            var segment = new Segment(line);

            segment.P1 = new EndPoint(segment);
            segment.P2 = new EndPoint(segment);
            _segments.Add(segment);
            _endpoints.Add(segment.P1);
            _endpoints.Add(segment.P2);
        }