private SphereModel GetSkeletone(int recursionLevel, CancellationToken token)
        {
            var res = GetBaseSkeleton();

            var bp = res.Item2;
            var triengles = res.Item1;

            var model = new SphereModel(bp);

            for (int i = 0; i < recursionLevel; i++)
            {
                var newTriengles = new List<RefTriengle>();

                foreach (var t in triengles)
                {
                    if (token.IsCancellationRequested)
                        return null;

                    var a = model.MiddlePoint(t.Points[0], t.Points[1]);
                    var b = model.MiddlePoint(t.Points[1], t.Points[2]);
                    var c = model.MiddlePoint(t.Points[2], t.Points[0]);

                    newTriengles.Add(new RefTriengle(t.Points[0], a, c));
                    newTriengles.Add(new RefTriengle(t.Points[1], b, a));
                    newTriengles.Add(new RefTriengle(t.Points[2], c, b));
                    newTriengles.Add(new RefTriengle(a, b, c));
                }

                triengles = newTriengles;
            }

            model.Normalize();
            model.Triengles = triengles;

            return model;
        }
        private Tuple<SphereModel, Dictionary<int, List<RefTriengleOptimize>>> GetOptimizeSkeleton(int recursionLevel, CancellationToken token)
        {
            var res = GetBaseSkeleton();

            var bp = res.Item2;
            var triengles = res.Item1;
            var resultDic = new Dictionary<int, List<RefTriengleOptimize>>();

            resultDic[0] = triengles.Select(e => new RefTriengleOptimize(e, 0)).ToList();

            var model = new SphereModel(bp);

            for (int i = 0; i < recursionLevel; i++)
            {
                var parents = resultDic[i];
                var childs = new List<RefTriengleOptimize>();

                foreach (var t in parents)
                {
                    if (token.IsCancellationRequested)
                        return null;

                    var a = model.MiddlePoint(t.Points[0], t.Points[1]);
                    var b = model.MiddlePoint(t.Points[1], t.Points[2]);
                    var c = model.MiddlePoint(t.Points[2], t.Points[0]);

                    var refs = new List<RefTriengleOptimize>
                    {
                        new RefTriengleOptimize(new RefTriengle(t.Points[0], a, c),i+1),
                        new RefTriengleOptimize(new RefTriengle(t.Points[1], b, a),i+1),
                        new RefTriengleOptimize(new RefTriengle(t.Points[2], c, b),i+1),
                        new RefTriengleOptimize(new RefTriengle(a, b, c),i+1)
                    };

                    foreach (var refT in refs)
                        refT.Parent = t;

                    t.Childs = refs.ToArray();
                    childs.AddRange(refs);
                }

                resultDic[i + 1] = childs;
            }

            model.Normalize();
            model.Triengles = triengles;

            return new Tuple<SphereModel, Dictionary<int, List<RefTriengleOptimize>>>(model, resultDic);
        }