public void CAP(Vector2d Point, int Frame, ref ColourVector ot) { int l = ThingsCache.Count(); for (int i = 0; i < l; i++) { IPhysical<Vector2d> Current = ThingsCache[i]; double diffX = Current.Position.x - Point.x; if (diffX * diffX < 1024) { double diffY = Current.Position.y - Point.y; if (diffY * diffY < 1024) { if (diffX != 0 && diffY != 0) { double d2 = Vector2d.DistSquared(Current.Position, Point); ot.AddMultiply(Current.Colour, 5184 / (d2 * d2)); } } } } for (int i = 0; i < ot.dimensions; i++) { ot.CoOrdinates[i] += BetterRandom.StdDev(0.01); } }
public static double DistSquared(Vector2d a,Vector2d b) { return ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); }
public static double AngleTowards(Vector2d a, Vector2d b) { return Math.Atan2(a.y - b.y, a.x - b.x); }
public ColourVector NextColourOnLine(Vector2d Point, double Angle, int Frame) { Angle = CircleifyAngle(Angle); IPhysical<Vector2d>[] Arr; int Dir; int Comp; GetArrayCompAndDirFromAngle(Angle, out Arr, out Dir, out Comp); int i = FindInitialIterator(Arr, Dir); i = MoveIteratorToFirstRelevantObject(Point, Arr, Dir, Comp, i); ColourVector c = new ColourVector(0, 0, 0, 0); double closest = FindPointsOnLine(Point, Angle, Arr, Dir, Comp, ref i, ref c); c.Multiply(512 / closest); return c; }
private static int MoveIteratorToFirstRelevantObject(Vector2d Point, IPhysical<Vector2d>[] Arr, int Dir, int Comp, int i) { bool co = true; while (co) { if (Dir * (Dir * (Arr[i].Position.CoOrdinates[Comp])) < (Dir * (Point.CoOrdinates[Comp] - (80 * Dir)))) { i += Dir; } else { co = false; } } return i; }
private static double FindPointsOnLine(Vector2d Point, double Angle, IPhysical<Vector2d>[] Arr, int Dir, int Comp, ref int i, ref ColourVector c) { double closest = 3600; while (Dir * (Dir * (Arr[i].Position.CoOrdinates[Comp])) < (Dir * (Point.CoOrdinates[Comp] - (80 * Dir)))) { Vector2d diff = (Arr[i].Position - Point); double DistSquared = Vector2d.DistSquared(Arr[i].Position, Point); if (DistSquared != 0) { double AngleFromPoin = Vector2d.AngleTowards(Arr[i].Position, Point); double NormalisedDistPerpendicularToThing = Math.Tan(Angle - AngleFromPoin); double q = DistSquared * NormalisedDistPerpendicularToThing * NormalisedDistPerpendicularToThing; if (q < (Arr[i].Size * Arr[i].Size)) { if (DistSquared < closest) { closest = DistSquared; c = Arr[i].Colour; } } } i++; } return closest; }