srecord noeq G22RegionThinner_v2<Img extends WidthAndHeight>(IImageRegion<Img> originalRegion) is Steppable { Rect bounds; IImageRegion<Img> region; // 0 = outside of region // 1 = inner pixel // 2 = border pixel // index is in bounds coordinates byte[] pixels; int idx(int x, int y) { ret (y-bounds.y)*bounds.w+x-bounds.x; } int idx(Pt p) { ret idx(p.x, p.y); } Pt idxToPt(int idx) { ret pt(bounds.x+(idx % bounds.w), bounds.y+idx/bounds.w); } byte getPixel(Pt p) { ret !containsPt(bounds, p) ? 0 : pixels[idx(p)]; } void init { if (bounds != null) ret; bounds = originalRegion.bounds(); pixels = new byte[area(bounds)]; for (Pt p : originalRegion.pixelIterator()) pixels[idx(p.x, p.y)] = 1; region = new ThinnedRegion; } class ThinnedRegion is IImageRegion<Img> { public Img image() { ret originalRegion.image(); } public Rect bounds() { ret bounds; } public bool contains(int x, int y) { ret containsPt(bounds, x, y) && pixels[idx(x, y)] > 0; } public ItIt<Pt> pixelIterator() { ret iff_null(new IF0<Pt> { int idx = 0; public Pt get() { for (; idx < pixels.length; idx++) if (pixels[idx] > 0) ret idxToPt(idx++); null; } }); } } public bool step() { init(); L<PtBuffer> traces = g22_allBorderTraces_withDiagonals(region); for (points : traces) for (p : points) pixels[idx(p)] = 2; new PtBuffer toDelete; for (points : traces) for ping (p : points) { if (deletableBorderPoint(p)) toDelete.add(p); } for (p : toDelete) pixels[idx(p)] = 0; ret nempty(toDelete); } bool deletableBorderPoint(Pt p) { int surroundingBorderPixels = 0, surroundingInnerPixels = 0; for (int dir = 1; dir <= 8; dir++) { Pt p2 = ptPlus(p, onePathDirection(dir)); byte value = getPixel(p2); if (value == 2) surroundingBorderPixels++; else if (value == 1) surroundingInnerPixels++; } bool deletable = surroundingInnerPixels > 0 && surroundingBorderPixels <= 2; printVars ifdef G22RegionThinner_debug(+p, +surroundingInnerPixels, +surroundingBorderPixels, +deletable); ret deletable; } IImageRegion region aka get() { ret or(region, originalRegion); } }
Began life as a copy of #1034983
download show line numbers debug dex old transpilations
Travelled to 3 computer(s): bhatertpkbcr, mowyntqkapby, mqqgnosmbjvj
No comments. add comment
Snippet ID: | #1034988 |
Snippet name: | G22RegionThinner_v2 - thin a region [backup] |
Eternal ID of this version: | #1034988/1 |
Text MD5: | 97578565acee40c7f1fe507d3d49e59a |
Author: | stefan |
Category: | javax |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2022-03-21 13:50:55 |
Source code size: | 2538 bytes / 96 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 118 / 132 |
Referenced in: | [show references] |