示例#1
0
        private static IHardenedPolymer MakeHull(IHardenedPolymer polymer)
        {
            var huller = new ConvexHuller();
            var hull   = huller.ComputeConvexHull(polymer);

            return(hull);
        }
示例#2
0
        private void FillOuterHull(IHardenedPolymer hull)
        {
            var origin    = hull.First();
            var triangles = new List <Triangle>();

            for (int i = 1; i < hull.Count - 1; i++)
            {
                triangles.Add(new Triangle(origin, hull[i], hull[i + 1]));
            }
            for (int i = 0; i < triangles.Count; i++)
            {
                var current = triangles[i];
                if (i - 1 >= 0)
                {
                    current.Neighbours.Add(triangles[i - 1]);
                }
                if (i + 1 < triangles.Count)
                {
                    current.Neighbours.Add(triangles[i + 1]);
                }
            }
            // До этого момента все ОК.
#warning Try Flip foreach here.
            this.triangles.AddRange(triangles);

            // Запускаем Делоне
            foreach (var triangle in this.triangles.ToList()) // тут меняем лист по которому идем.
            {
                if (this.triangles.Contains(triangle))        // Contains работает неправильно
                {
                    DelaunayFrom(triangle);
                }
            }
        }
示例#3
0
 public Segment(IHardenedPolymer polymer)
 {
     if (polymer.Count != 2)
     {
         throw new InvalidNumberOfNodesException("Чето тут не так.");
     }
     Polymer = polymer;
 }
示例#4
0
 public IHardenedPolymer ComputeConvexHull(IHardenedPolymer polymer)
 {
     if (polymer.Count < 3)
     {
         throw new InvalidNumberOfNodesException("Ну вы и децыбел.");
     }
     return(GrahamScan(polymer));
 }
示例#5
0
 private Triangle(IHardenedPolymer polymer, List <Triangle> neighbours)
 {
     if (polymer.Count != 3 || neighbours.Count > 3)
     {
         throw new InvalidNumberOfNodesException("Чето тут не так.");
     }
     Polymer    = polymer;
     Neighbours = neighbours;
 }
示例#6
0
        public Triangulation(IHardenedPolymer polymer)
            : this()
        {
            IHardenedPolymer hull = MakeHull(polymer);

            FillOuterHull(hull);
            IHardenedPolymer innerPoints = new Polymer(polymer.Except(hull));

#warning Add inner points here.
            FillInnerPoints(innerPoints);
            throw new NotImplementedException();
        }
示例#7
0
        public Polymer Sort(IHardenedPolymer polymer, Vector origin)
        {
            Polymer localPolymer = new Polymer(polymer);

            localPolymer.Remove(origin);

            Polymer top = new Polymer();
            Polymer bot = new Polymer();

            foreach (var node in localPolymer)
            {
                var op = node - origin;
                if (op.Y >= 0)
                {
                    top.Add(op);
                }
                else
                {
                    bot.Add(op);
                }
            }

            float cos(Vector point) => Math.Sign(point.X) * point.X * point.X / point.LengthSquared;

            top = new Polymer(top.OrderByDescending(cos));
            bot = new Polymer(bot.OrderBy(cos));

            Polymer sorted = new Polymer();

            sorted.Add(origin);
            foreach (var p in top)
            {
                sorted.Add(p + origin);
            }
            foreach (var p in bot)
            {
                sorted.Add(p + origin);
            }

            return(sorted);
        }
示例#8
0
        public Triangulation(IHardenedPolymer polymer, IDynamicRenderer renderer)
            : this()
        {
            // do same as Triangulation(IHardenedPolymer polymer)
            // but render steps

            staticRenderer = new StaticRenderer(renderer);
            staticRenderer.RenderText("Hello from hell.", new Vector(400));

            IHardenedPolymer hull = MakeHull(polymer);

#warning hull.ToSegments()
            staticRenderer.RenderSegments(hull.ToSegments(), "#ffff6b81");
            var hullString    = hull.ToPythonList();
            var polymerString = polymer.ToPythonList();
            FillOuterHull(hull); // hull.Count = 30; polymer.Count = 32. Вопрос?
            DrawCurrentTriangulationState();

            //staticRenderer.
            //staticRenderer.render
        }
示例#9
0
        private IHardenedPolymer GrahamScan(IHardenedPolymer polymer)
        {
            var angleSorter = new PolymerSorter();
            var origin      = polymer.OrderBy(p => p.Y).ThenBy(p => p.X).First();
            var ordered     = angleSorter.Sort(polymer, origin);
            var stack       = new Stack <Vector>();

            stack.Push(ordered[0]);
            stack.Push(ordered[1]);
            for (int i = 2; i < ordered.Count; i++)
            {
                while (stack.Count >= 2 && !CCW(stack.Skip(1).First(), stack.Peek(), ordered[i]))
                {
                    stack.Pop();
                }
                stack.Push(ordered[i]);
            }

            Polymer hull = new Polymer(stack.Reverse());

            return(hull);
        }
示例#10
0
 public ToVector2ListAdapter(IHardenedPolymer polymer)
     : this((List <RadianceStandard.Primitives.Vector>)polymer)
 {
 }
示例#11
0
 public Rectangle(IHardenedPolymer polymer)
 {
     Polymer = polymer;
 }
示例#12
0
 private void FillInnerPoints(IHardenedPolymer points)
 {
 }
示例#13
0
 public Triangle(IHardenedPolymer polymer, IEnumerable <Triangle> neighbours)
     : this(polymer, neighbours.ToList())
 {
 }
示例#14
0
 public Triangle(IHardenedPolymer polymer)
     : this(polymer, new List <Triangle>())
 {
 }
示例#15
0
 public Polymer(IHardenedPolymer polymer) : this((IEnumerable <Vector>)polymer)
 {
 }