public CirclePacker(FLOAT2 mPackingCenter, float mMinSeparation) { this.circles = PoolListCopyable <Circle> .Spawn(10); this.mPackingCenter = mPackingCenter; this.mMinSeparation = mMinSeparation; }
public static void GetOrientation(out int orientation, FLOAT2 dir, int steps = 8) { float step = 360f / steps; float stepHalf = step * 0.5f; var ang = System.Math.Atan2(dir.y, dir.x) * Mathf.Rad2Deg + stepHalf; if (ang < 0f) { ang = 360f + ang; } if (ang > 360f) { ang -= 360f; } var sector = (int)(ang / step); switch (sector) { case 0: orientation = 2; break; case 1: orientation = 1; break; case 2: orientation = 0; break; case 3: orientation = 7; break; case 4: orientation = 6; break; case 5: orientation = 5; break; case 6: orientation = 4; break; case 7: orientation = 3; break; default: orientation = 0; break; } }
public static FLOAT2 GetPointOnCircle(FLOAT2 point, FLOAT2 center, float radius) { var vX = point.x - center.x; var vY = point.y - center.y; var magV = Mathf.Sqrt(vX * vX + vY * vY); var aX = center.x + vX / magV * radius; var aY = center.y + vY / magV * radius; return(new FLOAT2(aX, aY)); }
public void Do(int iterationCounter) { // Sort circles based on the distance to center var instance = PoolClass <Circle.CirclesComparer> .Spawn(); instance.center = this.mPackingCenter; System.Array.Sort(this.circles.innerArray.arr, 0, this.circles.Count, instance); PoolClass <Circle.CirclesComparer> .Recycle(ref instance); for (int k = 0; k < iterationCounter; ++k) { var minSeparationSq = this.mMinSeparation * this.mMinSeparation; for (var i = 0; i < this.circles.Count - 1; i++) { for (var j = i + 1; j < this.circles.Count; j++) { if (i == j) { continue; } FLOAT2 AB = this.circles[j].mCenter - this.circles[i].mCenter; float r = this.circles[i].mRadius + this.circles[j].mRadius; // Length squared = (dx * dx) + (dy * dy); var d = AB.sqrMagnitude - minSeparationSq; float minSepSq = System.Math.Min(d, minSeparationSq); d -= minSepSq; if (d < r * r - 0.01f) { AB.Normalize(); AB *= (float)((r - System.Math.Sqrt(d)) * 0.5f); this.circles[j].mCenter += AB; this.circles[i].mCenter -= AB; } } } var damping = 0.1f / (float)iterationCounter; for (var i = 0; i < this.circles.Count; i++) { var v = this.circles[i].mCenter - this.mPackingCenter; v *= damping; this.circles[i].mCenter -= v; } } }
public static int GetOrientation(FLOAT2 from, FLOAT2 to) { MathUtils.GetOrientation(out var d, to - from); return(d); }
public static int GetOrientation(FLOAT2 dir) { MathUtils.GetOrientation(out var d, dir); return(d); }
public static string ToStringDec(this FLOAT2 value) { return(value.x.ToStringDec() + "; " + value.y.ToStringDec()); }
public static FLOAT2 Abs(FLOAT2 v) { return(new FLOAT2(Mathf.Abs(v.x), Mathf.Abs(v.y))); }
public void Add(Entity data, FLOAT2 center, float radius) { this.circles.Add(new Circle(data, center, radius)); }
public Circle(Entity data, FLOAT2 iCenter, float radius) { this.data = data; this.mCenter = iCenter; this.mRadius = radius; }
public static string ToFullString(this FLOAT2 vec) { return($"{vec.x};{vec.y}"); }