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 }
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); }
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)); }
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); }
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(); }
/// <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(); }
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(); }
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(); }