Rotate Vector
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; namespace InfoStrat.VE.Utilities { public static class MathHelper { public static Vector RotateVector(Vector v, double angle) { double len = v.Length; if (len == 0) return v; double refAngle = Get2DAngle(v, new Vector(1, 0)); double dx = len * Math.Cos((refAngle + angle) * Math.PI / 180.0); double dy = -len * Math.Sin((refAngle + angle) * Math.PI / 180.0); return new Vector(dx, dy); } public static double Get2DAngle(Vector a, Vector b) { double cosine = (a.X * b.X + a.Y * b.Y) / (a.Length * b.Length); if (cosine > 1) cosine = 1; else if (cosine < -1) cosine = -1; if ((a.X * b.Y - a.Y * b.X) < 0) return -Math.Acos(cosine) * 180.0 / Math.PI; else return Math.Acos(cosine) * 180.0 / Math.PI; } public static double MapValue(double value, double fromMin, double fromMax, double toMin, double toMax) { //Normalize double ret = (value - fromMin) / (fromMax - fromMin); //Resize and translate return ret * (toMax - toMin) + toMin; } public static double Clamp(double value, double min, double max) { double actualMin = Math.Min(min, max); double actualMax = Math.Max(min, max); return Math.Min(actualMax, Math.Max(actualMin, value)); } } }