Пример #1
0
        public bool Optimize(SphereModel model, float optimizeIndent)
        {
            if (__Proccessed)
                return false;

            __Proccessed = true;

            if (Childs == null)
            {
                IsOk = true;
                return true;
            }

            if (Childs.Any(e => !e.IsOk))
                return false;

            var pointIndexes = Childs.SelectMany(e => e.Points).Distinct().ToList();
            var points = pointIndexes.Select(index => model.Points[index]).ToList();
            var colors = pointIndexes.Select(index => model.Colors[index]).ToArray();

            var lens = points.Select(e => e.Length).ToList();

            var minPointLenght = lens.Min();
            var maxPointLenght = lens.Max();

            var div = (maxPointLenght / minPointLenght - 1);

            if (Math.Abs(div) < optimizeIndent && IsColorDivEnabled(colors, optimizeIndent))
            {
                Optimize(model);
                return true;
            }

            return false;
        }
Пример #2
0
 private void Optimize(SphereModel model)
 {
     IsOk = true;
     foreach (var child in Childs)
         child.IsOk = false;
 }
Пример #3
0
 public void FixLines(SphereModel model)
 {
     OptimazeLine(model, Points[0], Points[1]);
     OptimazeLine(model, Points[1], Points[2]);
     OptimazeLine(model, Points[2], Points[0]);
 }
Пример #4
0
        private void OptimazeLine(SphereModel model, int p1, int p2)
        {
            int pIndex;
            if (model.Cache.Get(p1, p2, out pIndex))
            {
                model.Points[pIndex] = (model.Points[p1] + model.Points[p2]) * 0.5f;

                OptimazeLine(model, p1, pIndex);
                OptimazeLine(model, p2, pIndex);
            }
        }
Пример #5
0
        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;
        }
Пример #6
0
        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);
        }
Пример #7
0
        private void FillSphereOptimize(SphereModel model, PlanetContainer settings,
            Dictionary<int, List<RefTriengleOptimize>> triengles)
        {
            var container = settings.Container3D;
            var lastRank = container.RecursionLevel;

            var cc = new ColorContainer(settings.Shema.Layers[0], __NativeGenerator.GetAltRange());
            var optimazeLevel = container.OptimizePecent * 0.01f;
            var lastTriengles = triengles[lastRank];

            foreach (var triengle in lastTriengles)
                triengle.IsOk = true;

            var points = lastTriengles
                .SelectMany(e => e.Points)
                .Distinct();

            foreach (var pointIndex in points)
            {
                var p = model.Points[pointIndex];

                byte s;
                var alt = __NativeGenerator.GetAlt(p.X, p.Y, p.Z, 100, out s);

                if (alt > 0)
                    p *= (1 + (float)alt * container.LandscapeOver);
                else
                    p *= (1 + (float)alt * container.LandscapeUnder);

                var color = cc.GetColor(alt);

                model.Colors[pointIndex] = color;
                model.Points[pointIndex] = p;
            }

            var forProcess = lastTriengles;

            while (forProcess.Count > 0)
            {
                var nextWave = new List<RefTriengleOptimize>();

                foreach (var t in forProcess.Where(e => e.Parent != null && e.Rank > 2))
                {
                    if (t.Optimize(model, optimazeLevel))
                        nextWave.Add(t.Parent);
                }

                forProcess = nextWave;
            }

            var refResult = triengles
                .SelectMany(e => e.Value)
                .Where(e => e.IsOk).ToList();

            foreach (var t in refResult)
                t.FixLines(model);

            model.Triengles = refResult
                .Select(e => e.Triengle)
                .ToList();
        }
Пример #8
0
        private void FillSphere(SphereModel model, PlanetContainer settings)
        {
            var container = settings.Container3D;
            var cc = new ColorContainer(settings.Shema.Layers[0], __NativeGenerator.GetAltRange());
            var len = model.Points.Count;

            for (int i = 0; i < len; i++)
            {
                var p = model.Points[i];
                byte s;
                var alt = __NativeGenerator.GetAlt(p.X, p.Y, p.Z, 100, out s);

                if (alt > 0)
                    p *= (1 + (float)alt * container.LandscapeOver);
                else
                    p *= (1 + (float)alt * container.LandscapeUnder);

                var color = cc.GetColor(alt);

                model.Colors[i] = color;
                model.Points[i] = p;
            }
        }