Beispiel #1
0
        void drawRgn(Canvas canvas, int color, String str, Region.Op op)
        {
            if (str != null)
            {
                mPaint.setColor(Color.BLACK);
                canvas.drawText(str, 80, 24, mPaint);
            }

            Region rgn = new Region();

            rgn.set(mRect1);
            rgn.op(mRect2, op);

            mPaint.setColor(color);
            RegionIterator iter = new RegionIterator(rgn);
            Rect           r    = new Rect();

            canvas.translate(0, 30);
            mPaint.setColor(color);
            while (iter.next(r))
            {
                canvas.drawRect(r, mPaint);
            }
            drawOriginalRects(canvas, 0x80);
        }
        void ColorDodgeLayer(Layer layer)
        {
            var layers   = ActiveImage.Layers;
            int index    = layers.GetIndex(layer);
            var previous = layers[index + 1];

            Console.WriteLine("layer: " + layer.Name);
            Console.WriteLine("previous: " + previous.Name);

            var srcPR  = new PixelRgn(previous, false, false);
            var destPR = new PixelRgn(layer, false, false);

#if false
            var iterator = new RegionIterator(srcPR, destPR);

            iterator.ForEach((src, dest) =>
            {
                dest.Red   = ColorDodge(src.Red, dest.Red);
                dest.Green = ColorDodge(src.Green, dest.Green);
                dest.Blue  = ColorDodge(src.Blue, dest.Blue);
            });
#else
            var iterator = new RegionIterator(destPR);

            iterator.ForEach((dest) =>
                             {});
#endif
        }
Beispiel #3
0
        void DoDifference(Drawable sourceDrawable, Drawable toDiffDrawable)
        {
            _indexedColorsMap = new IndexedColorsMap();

            var rectangle = sourceDrawable.MaskBounds;
            var srcPR     = new PixelRgn(sourceDrawable, rectangle, true, true);
            var destPR    = new PixelRgn(toDiffDrawable, rectangle, false, false);

            var iterator = new RegionIterator(srcPR, destPR);

            iterator.ForEach((src, dest) => src.Set(MakeAbsDiff(dest, src)));

            sourceDrawable.Flush();
            sourceDrawable.MergeShadow(false);
            sourceDrawable.Update(rectangle);
        }
Beispiel #4
0
        public static bool Run(bool print = false)
        {
            // Generate the input geometry.
            var polygon = new Polygon(8, true);

            // Two intersecting rectangles.
            var A = Generate.Rectangle(0d, 0d, 4d, 4d, label: 1);
            var B = Generate.Rectangle(1d, 1d, 4d, 4d, label: 2);

            polygon.Add(A);
            polygon.Add(B);

            // Generate mesh.
            var mesh = (Mesh)polygon.Triangulate();

            if (print)
            {
                SvgImage.Save(mesh, "example-7.svg", 500);
            }

            // Find a seeding triangle (in this case, the point (2, 2) lies in
            // both rectangles).
            var seed = (new TriangleQuadTree(mesh)).Query(2.0, 2.0) as Triangle;

            var iterator = new RegionIterator(mesh);

            iterator.Process(seed, t => t.Label ^= 1, 1);
            iterator.Process(seed, t => t.Label ^= 2, 2);

            // At this point, all triangles will have label 1, 2 or 3 (= 1 xor 2).

            // The intersection of A and B.
            var intersection = mesh.Triangles.Where(t => t.Label == 3);

            // The difference A \ B.
            var difference = mesh.Triangles.Where(t => t.Label == 1);

            // The xor of A and B.
            var xor = mesh.Triangles.Where(t => t.Label == 1 || t.Label == 2);

            return(intersection.Any() && difference.Any() && xor.Any());
        }
        public void TestProcessRegionProtected()
        {
            var poly = new Polygon();

            // Outer region.
            poly.Add(Helper.Rectangle(-2d, 2d, 2d, -2d, 2));

            // Inner region.
            poly.Add(Helper.Rectangle(-1d, 1d, 1d, -1d, 1));

            poly.Regions.Add(new RegionPointer(0d, 0d, 1));

            var mesh = (Mesh)poly.Triangulate();

            var iterator = new RegionIterator(mesh);

            var qtree = new TriangleQuadTree(mesh);

            // Find a seeding triangle in region 1.
            var seed = (Triangle)qtree.Query(0.0, 0.0);

            iterator.Process(seed, t => Assert.AreEqual(1, t.Label));
        }
Beispiel #6
0
        public Mesh FindRegions()
        {
            // Generate the input geometry.
            var polygon = new Polygon(8, true);

            // Two intersecting rectangles.
            var A = CreateRectangle(0.0, 4.0, 4.0, 0.0, 1);
            var B = CreateRectangle(1.0, 5.0, 3.0, 1.0, 2);

            polygon.Add(A);
            polygon.Add(B);

            // Generate mesh.
            var mesh = (Mesh)polygon.Triangulate();

            // Find a seeding triangle (in this case, the point (2, 2) lies in
            // both rectangles).
            var seed = (new TriangleQuadTree(mesh)).Query(2.0, 2.0) as Triangle;

            var iterator = new RegionIterator(mesh);

            iterator.Process(seed, t => t.Label ^= 1, 1);
            iterator.Process(seed, t => t.Label ^= 2, 2);

            // At this point, all triangles will have label 1, 2 or 3 (= 1 xor 2).

            // The intersection of A and B.
            var intersection = mesh.Triangles.Where(t => t.Label == 3);

            // The difference A \ B.
            var difference = mesh.Triangles.Where(t => t.Label == 1);

            // The xor of A and B.
            var xor = mesh.Triangles.Where(t => t.Label == 1 || t.Label == 2);

            return(mesh);
        }
Beispiel #7
0
        public void Render(Image image, Drawable drawable)
        {
            var parser = new MathExpressionParser();
              parser.Init(GetValue<string>("formula"), image.Dimensions);

              var newImage = new Image(image.Dimensions, image.BaseType);
              var srcPR = new PixelRgn(drawable, image.Bounds, false, false);

              PixelRgn destPR1 = null;
              var layer1 = AddLayer(newImage, 1, _("layer_one"), "translate_1_x",
                "translate_1_y", out destPR1);

              PixelRgn destPR2 = null;
              var layer2 = AddLayer(newImage, 2, _("layer_two"), "translate_2_x",
                "translate_2_y", out destPR2);

              var transparent = new Pixel(4);

              if (destPR1 != null && destPR2 != null)
            {
              var iterator = new RegionIterator(srcPR, destPR1, destPR2);
              iterator.ForEach((src, dest1, dest2) =>
            {
              var tmp = Copy(src);
              if (parser.Eval(src) < 0)
              {
            dest1.Set(tmp);
            dest2.Set(transparent);
              }
              else
              {
            dest2.Set(tmp);
            dest1.Set(transparent);
              }
            });
            }
              else if (destPR1 != null)
            {
              var iterator = new RegionIterator(srcPR, destPR1);
              iterator.ForEach((src, dest) =>
               dest.Set((parser.Eval(src) < 0)
                    ? Copy(src) : transparent));
            }
              else	// destPR2 != null
            {
              var iterator = new RegionIterator(srcPR, destPR2);
              iterator.ForEach((src, dest) =>
               dest.Set((parser.Eval(src) >= 0)
                    ? Copy(src) : transparent));
            }

              Rotate(layer1, GetValue<int>("rotate_1"));
              Rotate(layer2, GetValue<int>("rotate_2"));

              if (GetValue<bool>("merge"))
            {
              var merged =
            newImage.MergeVisibleLayers(MergeType.ExpandAsNecessary);
              merged.Offsets = new Offset(0, 0);
              newImage.Resize(merged.Dimensions, merged.Offsets);
            }

              new Display(newImage);

              Display.DisplaysFlush();
        }
Beispiel #8
0
        void DoDifference(Drawable sourceDrawable, Drawable toDiffDrawable)
        {
            _indexedColorsMap = new IndexedColorsMap();

              var rectangle = sourceDrawable.MaskBounds;
              var srcPR = new PixelRgn(sourceDrawable, rectangle, true, true);
              var destPR = new PixelRgn(toDiffDrawable, rectangle, false, false);

              var iterator = new RegionIterator(srcPR, destPR);
              iterator.ForEach((src, dest) => src.Set(MakeAbsDiff(dest, src)));

              sourceDrawable.Flush();
              sourceDrawable.MergeShadow(false);
              sourceDrawable.Update(rectangle);
        }
Beispiel #9
0
        /// <summary>
        /// Find the holes and infect them. Find the area constraints and infect
        /// them. Infect the convex hull. Spread the infection and kill triangles.
        /// Spread the area constraints.
        /// </summary>
        public void CarveHoles()
        {
            Otri         searchtri = default(Otri);
            Vertex       searchorg, searchdest;
            LocateResult intersect;

            Triangle[] regionTris = null;

            if (!mesh.behavior.Convex)
            {
                // Mark as infected any unprotected triangles on the boundary.
                // This is one way by which concavities are created.
                InfectHull();
            }

            if (!mesh.behavior.NoHoles)
            {
                // Infect each triangle in which a hole lies.
                foreach (var hole in mesh.holes)
                {
                    // Ignore holes that aren't within the bounds of the mesh.
                    if (mesh.bounds.Contains(hole))
                    {
                        // Start searching from some triangle on the outer boundary.
                        searchtri.triangle = Mesh.dummytri;
                        searchtri.orient   = 0;
                        searchtri.SymSelf();
                        // Ensure that the hole is to the left of this boundary edge;
                        // otherwise, locate() will falsely report that the hole
                        // falls within the starting triangle.
                        searchorg  = searchtri.Org();
                        searchdest = searchtri.Dest();
                        if (Primitives.CounterClockwise(searchorg, searchdest, hole) > 0.0)
                        {
                            // Find a triangle that contains the hole.
                            intersect = mesh.locator.Locate(hole, ref searchtri);
                            if ((intersect != LocateResult.Outside) && (!searchtri.IsInfected()))
                            {
                                // Infect the triangle. This is done by marking the triangle
                                // as infected and including the triangle in the virus pool.
                                searchtri.Infect();
                                viri.Add(searchtri.triangle);
                            }
                        }
                    }
                }
            }

            // Now, we have to find all the regions BEFORE we carve the holes, because locate() won't
            // work when the triangulation is no longer convex. (Incidentally, this is the reason why
            // regional attributes and area constraints can't be used when refining a preexisting mesh,
            // which might not be convex; they can only be used with a freshly triangulated PSLG.)
            if (mesh.regions.Count > 0)
            {
                int i = 0;

                regionTris = new Triangle[mesh.regions.Count];

                // Find the starting triangle for each region.
                foreach (var region in mesh.regions)
                {
                    regionTris[i] = Mesh.dummytri;
                    // Ignore region points that aren't within the bounds of the mesh.
                    if (mesh.bounds.Contains(region.point))
                    {
                        // Start searching from some triangle on the outer boundary.
                        searchtri.triangle = Mesh.dummytri;
                        searchtri.orient   = 0;
                        searchtri.SymSelf();
                        // Ensure that the region point is to the left of this boundary
                        // edge; otherwise, locate() will falsely report that the
                        // region point falls within the starting triangle.
                        searchorg  = searchtri.Org();
                        searchdest = searchtri.Dest();
                        if (Primitives.CounterClockwise(searchorg, searchdest, region.point) > 0.0)
                        {
                            // Find a triangle that contains the region point.
                            intersect = mesh.locator.Locate(region.point, ref searchtri);
                            if ((intersect != LocateResult.Outside) && (!searchtri.IsInfected()))
                            {
                                // Record the triangle for processing after the
                                // holes have been carved.
                                regionTris[i]        = searchtri.triangle;
                                regionTris[i].region = region.id;
                            }
                        }
                    }

                    i++;
                }
            }

            if (viri.Count > 0)
            {
                // Carve the holes and concavities.
                Plague();
            }

            if (regionTris != null)
            {
                var iterator = new RegionIterator(mesh);

                for (int i = 0; i < regionTris.Length; i++)
                {
                    if (regionTris[i] != Mesh.dummytri)
                    {
                        // Make sure the triangle under consideration still exists.
                        // It may have been eaten by the virus.
                        if (!Otri.IsDead(regionTris[i]))
                        {
                            // Apply one region's attribute and/or area constraint.
                            iterator.Process(regionTris[i]);
                        }
                    }
                }
            }

            // Free up memory (virus pool should be empty anyway).
            viri.Clear();
        }
Beispiel #10
0
        public void Render(Image image, Drawable drawable)
        {
            var parser = new MathExpressionParser();

            parser.Init(GetValue <string>("formula"), image.Dimensions);

            var newImage = new Image(image.Dimensions, image.BaseType);
            var srcPR    = new PixelRgn(drawable, image.Bounds, false, false);

            PixelRgn destPR1 = null;
            var      layer1  = AddLayer(newImage, 1, _("layer_one"), "translate_1_x",
                                        "translate_1_y", out destPR1);

            PixelRgn destPR2 = null;
            var      layer2  = AddLayer(newImage, 2, _("layer_two"), "translate_2_x",
                                        "translate_2_y", out destPR2);

            var transparent = new Pixel(4);

            if (destPR1 != null && destPR2 != null)
            {
                var iterator = new RegionIterator(srcPR, destPR1, destPR2);
                iterator.ForEach((src, dest1, dest2) =>
                {
                    var tmp = Copy(src);
                    if (parser.Eval(src) < 0)
                    {
                        dest1.Set(tmp);
                        dest2.Set(transparent);
                    }
                    else
                    {
                        dest2.Set(tmp);
                        dest1.Set(transparent);
                    }
                });
            }
            else if (destPR1 != null)
            {
                var iterator = new RegionIterator(srcPR, destPR1);
                iterator.ForEach((src, dest) =>
                                 dest.Set((parser.Eval(src) < 0)
                                    ? Copy(src) : transparent));
            }
            else // destPR2 != null
            {
                var iterator = new RegionIterator(srcPR, destPR2);
                iterator.ForEach((src, dest) =>
                                 dest.Set((parser.Eval(src) >= 0)
                                    ? Copy(src) : transparent));
            }

            Rotate(layer1, GetValue <int>("rotate_1"));
            Rotate(layer2, GetValue <int>("rotate_2"));

            if (GetValue <bool>("merge"))
            {
                var merged =
                    newImage.MergeVisibleLayers(MergeType.ExpandAsNecessary);
                merged.Offsets = new Offset(0, 0);
                newImage.Resize(merged.Dimensions, merged.Offsets);
            }

            new Display(newImage);

            Display.DisplaysFlush();
        }
Beispiel #11
0
        public void CarveHoles()
        {
            Otri otri = new Otri();

            Triangle[] triangleArray = null;
            if (!this.mesh.behavior.Convex)
            {
                this.InfectHull();
            }
            if (!this.mesh.behavior.NoHoles)
            {
                foreach (Point hole in this.mesh.holes)
                {
                    if (!this.mesh.bounds.Contains(hole))
                    {
                        continue;
                    }
                    otri.triangle = Mesh.dummytri;
                    otri.orient   = 0;
                    otri.SymSelf();
                    if (Primitives.CounterClockwise(otri.Org(), otri.Dest(), hole) <= 0 || this.mesh.locator.Locate(hole, ref otri) == LocateResult.Outside || otri.IsInfected())
                    {
                        continue;
                    }
                    otri.Infect();
                    this.viri.Add(otri.triangle);
                }
            }
            if (this.mesh.regions.Count > 0)
            {
                int num = 0;
                triangleArray = new Triangle[this.mesh.regions.Count];
                foreach (RegionPointer region in this.mesh.regions)
                {
                    triangleArray[num] = Mesh.dummytri;
                    if (this.mesh.bounds.Contains(region.point))
                    {
                        otri.triangle = Mesh.dummytri;
                        otri.orient   = 0;
                        otri.SymSelf();
                        if (Primitives.CounterClockwise(otri.Org(), otri.Dest(), region.point) > 0 && this.mesh.locator.Locate(region.point, ref otri) != LocateResult.Outside && !otri.IsInfected())
                        {
                            triangleArray[num]        = otri.triangle;
                            triangleArray[num].region = region.id;
                        }
                    }
                    num++;
                }
            }
            if (this.viri.Count > 0)
            {
                this.Plague();
            }
            if (triangleArray != null)
            {
                RegionIterator regionIterator = new RegionIterator(this.mesh);
                for (int i = 0; i < (int)triangleArray.Length; i++)
                {
                    if (triangleArray[i] != Mesh.dummytri && !Otri.IsDead(triangleArray[i]))
                    {
                        regionIterator.Process(triangleArray[i]);
                    }
                }
            }
            this.viri.Clear();
        }
        void ColorDodgeLayer(Layer layer)
        {
            var layers = ActiveImage.Layers;
              int index = layers.GetIndex(layer);
              var previous = layers[index + 1];

              Console.WriteLine("layer: " + layer.Name);
              Console.WriteLine("previous: " + previous.Name);

              var srcPR = new PixelRgn(previous, false, false);
              var destPR = new PixelRgn(layer, false, false);

            #if false

              var iterator = new RegionIterator(srcPR, destPR);

              iterator.ForEach((src, dest) =>
            {
              dest.Red = ColorDodge(src.Red, dest.Red);
              dest.Green = ColorDodge(src.Green, dest.Green);
              dest.Blue = ColorDodge(src.Blue, dest.Blue);
            });
            #else
              var iterator = new RegionIterator(destPR);

              iterator.ForEach((dest) =>
            {});
            #endif
        }