Exemplo n.º 1
0
        public CirclePacker(FLOAT2 mPackingCenter, float mMinSeparation)
        {
            this.circles = PoolListCopyable <Circle> .Spawn(10);

            this.mPackingCenter = mPackingCenter;
            this.mMinSeparation = mMinSeparation;
        }
Exemplo n.º 2
0
        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;
            }
        }
Exemplo n.º 3
0
        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));
        }
Exemplo n.º 4
0
        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;
                }
            }
        }
Exemplo n.º 5
0
 public static int GetOrientation(FLOAT2 from, FLOAT2 to)
 {
     MathUtils.GetOrientation(out var d, to - from);
     return(d);
 }
Exemplo n.º 6
0
 public static int GetOrientation(FLOAT2 dir)
 {
     MathUtils.GetOrientation(out var d, dir);
     return(d);
 }
Exemplo n.º 7
0
 public static string ToStringDec(this FLOAT2 value)
 {
     return(value.x.ToStringDec() + "; " + value.y.ToStringDec());
 }
Exemplo n.º 8
0
 public static FLOAT2 Abs(FLOAT2 v)
 {
     return(new FLOAT2(Mathf.Abs(v.x), Mathf.Abs(v.y)));
 }
Exemplo n.º 9
0
 public void Add(Entity data, FLOAT2 center, float radius)
 {
     this.circles.Add(new Circle(data, center, radius));
 }
Exemplo n.º 10
0
 public Circle(Entity data, FLOAT2 iCenter, float radius)
 {
     this.data    = data;
     this.mCenter = iCenter;
     this.mRadius = radius;
 }
Exemplo n.º 11
0
 public static string ToFullString(this FLOAT2 vec)
 {
     return($"{vec.x};{vec.y}");
 }