/// <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)); }
public float PerpendicularAngle(Polygon polygon, Vector2 position, float angle) { foreach (var line in polygon.Lines) { if (Intersects(line)) { return(line.PerpendicularAngle(Mathf.Angle(position, Mathf.Move(position, angle, -1)))); } } return(0); }
public float ReflectionAngle(float perpendicularAngle) { var originalAngle = Mathf.Angle(Start, End); float reflectionAngle = perpendicularAngle, angleDif = Mathf.AngleDifference(originalAngle, MathHelper.WrapAngle(perpendicularAngle + Mathf.Pi)); float b; if (Mathf.AngleDifference((b = (perpendicularAngle + angleDif)), MathHelper.WrapAngle(originalAngle + Mathf.Pi)) <= Mathf.PiOver1024) { reflectionAngle -= angleDif; } else { reflectionAngle = b; } return(reflectionAngle); }
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); }
public float PerpendicularAngle(Line line, Vector2 position, float angle) { return(line.PerpendicularAngle(Mathf.Angle(position, Mathf.Move(position, angle, -1)))); }
public float ReflectionAngle(Line line) { return(ReflectionAngle(line.PerpendicularAngle(Mathf.Angle(End, Start)))); }