Advertisement
yclee126

Remove hidden rectangles (Processing 3)

Aug 28th, 2022
1,302
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.90 KB | None | 0 0
  1. // remove fully overlapped rectangles
  2. // drag mouse to draw a new rectangle
  3.  
  4. // Code for Processing 3
  5.  
  6. int grid = 10; // snap to grid, 1 to disable
  7.  
  8. float newX0, newY0;
  9. float newX1, newY1;
  10.  
  11. int rectNumber = 0;
  12.  
  13. boolean drawInternal = false; // 'i' key
  14. boolean transparency = true; // 't' key
  15.  
  16. ArrayList<ExtraRect> extraRectList = new ArrayList();
  17.  
  18.  
  19. class Rect {
  20.     float x0, y0, x1, y1;
  21.    
  22.     Rect(float _x0, float _y0, float _x1, float _y1) {
  23.       x0 = _x0;
  24.       y0 = _y0;
  25.       x1 = _x1;
  26.       y1 = _y1;
  27.     }
  28. }
  29.  
  30. class ExtraRect {
  31.   Rect origRect;
  32.   ArrayList<Rect> rectList;
  33.   int n;
  34.   float c;
  35.  
  36.   ExtraRect(Rect _origRect, float _c, int _n) {
  37.     origRect = _origRect;
  38.     rectList = new ArrayList();
  39.     rectList.add(origRect);
  40.     c = _c;
  41.     n = _n;
  42.   }
  43. }
  44.  
  45.  
  46. void setup(){
  47.   size(600, 600);
  48.   colorMode(HSB, 1);
  49.   stroke(0, 0, 0, 0);
  50.   textSize(20);
  51. }
  52.  
  53. void draw(){
  54.   background(1);
  55.  
  56.   // draw saved rects
  57.   textAlign(CENTER, CENTER);
  58.   for(int i = 0; i < extraRectList.size(); i ++) {
  59.     ExtraRect er = extraRectList.get(i);
  60.     Rect r = er.origRect;
  61.    
  62.     // draw filled rect
  63.     if (transparency) {
  64.       fill(er.c, 1, 0.8, 0.3);
  65.     } else {
  66.       fill(er.c, 0.4, 0.9, 1);
  67.     }
  68.     rectangle(r.x0, r.y0, r.x1, r.y1);
  69.    
  70.     // draw internal boundaries
  71.     if (drawInternal) {
  72.       fill(0, 0, 0, 0);
  73.       stroke(0, 0, 0, 1);
  74.       ArrayList<Rect> rectList = er.rectList;
  75.       for(int j = 0; j < rectList.size(); j ++) {
  76.         Rect ir = rectList.get(j);
  77.         hollowRect(ir.x0, ir.y0, ir.x1, ir.y1);
  78.       }
  79.       stroke(0, 0, 0, 0);
  80.     }
  81.    
  82.     // draw number
  83.     fill(0, 0, 0, 1);
  84.     text(str(er.n), (r.x0+r.x1)/2, (r.y0+r.y1)/2);
  85.   }
  86.  
  87.   // draw the new rect
  88.   if (mousePressed) {
  89.     fill(0, 0, 0, 0.3);
  90.     rectangle(newX0, newY0, newX1, newY1);
  91.   }
  92.  
  93.   // draw texts
  94.   textAlign(LEFT, TOP);
  95.   fill(0, 0, 0, 1);
  96.   text("Rects displayed: "+str(extraRectList.size()), 0, 0);
  97.  
  98.   // find the rect under the cursor (find it from the back)
  99.   for(int i = extraRectList.size()-1; i >= 0; i --) {
  100.     Rect r = extraRectList.get(i).origRect;
  101.     if (r.x0 <= mouseX && mouseX <= r.x1 && r.y0 <= mouseY && mouseY <= r.y1) {
  102.       text("Cursor: "+str(extraRectList.get(i).n), 0, 20);
  103.       break;
  104.     }
  105.   }
  106.  
  107. }
  108.  
  109.  
  110. void removeHiddenRects(ArrayList<ExtraRect> extraRects, Rect newRect) {
  111.   Rect nr = newRect;
  112.  
  113.   // for each ExtraRect
  114.   for (int i = 0; i < extraRects.size(); i ++) {
  115.     ArrayList<Rect> rectList = extraRects.get(i).rectList;
  116.    
  117.     // for each Rect areas of an ExtraRect
  118.     for (int j = 0; j < rectList.size(); j ++) {
  119.       Rect r = rectList.get(j);
  120.      
  121.       // check if it's not touching
  122.       if (r.x1 < nr.x0 || nr.x1 < r.x0 || r.y1 < nr.y0 || nr.y1 < r.y0) {
  123.         continue;
  124.       }
  125.      
  126.       // split rect into smaller rects - clockwise pattern
  127.       //
  128.       // +-n---+  <-- old rect
  129.       // | |   |
  130.       // | +-+-e
  131.       // | | | |  <-- new rect
  132.       // w-+-+ |
  133.       // |   | |
  134.       // +---s-+
  135.      
  136.       // find each key points
  137.       boolean n = r.x0 < nr.x0 || r.y0 < nr.y0;
  138.       float xn = max(r.x0, nr.x0);
  139.       float yn = r.y0;
  140.      
  141.       boolean e = nr.x1 < r.x1 || r.y0 < nr.y0;
  142.       float xe = r.x1;
  143.       float ye = max(r.y0, nr.y0);
  144.      
  145.       boolean s = nr.x1 < r.x1 || nr.y1 < r.y1;
  146.       float xs = min(r.x1, nr.x1);
  147.       float ys = r.y1;
  148.      
  149.       boolean w = r.x0 < nr.x0 || nr.y1 < r.y1;
  150.       float xw = r.x0;
  151.       float yw = min(r.y1, nr.y1);
  152.      
  153.       // remove current rect
  154.       rectList.remove(j);
  155.       j --;
  156.      
  157.       // add new rects
  158.       if (n && e && yn != ye) {
  159.         j ++;
  160.         rectList.add(j, new Rect(xn, yn, xe, ye-1));
  161.       }
  162.       if (e && s && xe != xs) {
  163.         j ++;
  164.         rectList.add(j, new Rect(xs+1, ye, xe, ys));
  165.       }
  166.       if (s && w && ys != yw) {
  167.         j ++;
  168.         rectList.add(j, new Rect(xw, yw+1, xs, ys));
  169.       }
  170.       if (w && n && xw != xn) {
  171.         j ++;
  172.         rectList.add(j, new Rect(xw, yn, xn-1, yw));
  173.       }
  174.     }
  175.    
  176.     // ExtraRect fully overlapped - remove it
  177.     if (rectList.size() == 0) {
  178.       extraRects.remove(i);
  179.       i --;
  180.     }
  181.   }
  182. }
  183.  
  184.  
  185. // 4-point rect (inclusive)
  186. void rectangle(float x0, float y0, float x1, float y1) {
  187.   rect(x0, y0, x1-x0+1, y1-y0+1);
  188. }
  189.  
  190. // pixel perfect inclusive outline drawing
  191. void hollowRect(float x0, float y0, float x1, float y1) {
  192.   line(x0, y0, x1, y0);
  193.   line(x1, y0, x1, y1);
  194.   line(x1, y1, x0, y1);
  195.   line(x0, y1, x0, y0);
  196. }
  197.  
  198. // mouse callback functions for updating the coord of the new rectangle
  199. float step(float n) {
  200.   return round(n/grid)*grid;
  201. }
  202.  
  203. void mousePressed() {
  204.   newX0 = step(mouseX);
  205.   newY0 = step(mouseY);
  206.  
  207.   newX1 = step(mouseX)-1;
  208.   newY1 = step(mouseY)-1;
  209. }
  210.  
  211. void mouseDragged() {
  212.   newX1 = step(mouseX)-1;
  213.   newY1 = step(mouseY)-1;
  214. }
  215.  
  216. void mouseReleased() {
  217.   // correct the coords
  218.   float t;
  219.   if (newX1 < newX0) {
  220.     t = newX0;
  221.     newX0 = newX1+1;
  222.     newX1 = t-1;
  223.   }
  224.   if (newY1 < newY0) {
  225.     t = newY0;
  226.     newY0 = newY1+1;
  227.     newY1 = t-1;
  228.   }
  229.  
  230.   // clip to boundaries
  231.   newX0 = newX0 < 0 ? 0 : newX0;
  232.   newY0 = newY0 < 0 ? 0 : newY0;
  233.   newX1 = newX1 > width-1 ? width-1 : newX1;
  234.   newY1 = newY1 > height-1 ? height-1 : newY1;
  235.  
  236.   // add to the extraRect
  237.   if(newX0-newX1 != 1 && newY0-newY1 != 1){
  238.     Rect newRect = new Rect(newX0, newY0, newX1, newY1);
  239.    
  240.     // before adding, remove overlapping rect(s)
  241.     removeHiddenRects(extraRectList, newRect);
  242.    
  243.     // add to the list
  244.     rectNumber ++;
  245.     extraRectList.add(new ExtraRect(newRect, random(1), rectNumber));
  246.   }
  247. }
  248.  
  249. // toggle settings
  250. void keyPressed() {
  251.   if (key == ' ') {
  252.     extraRectList.clear();
  253.     rectNumber = 0;
  254.   }
  255.   else if (key == 'i') {
  256.     drawInternal = !drawInternal;
  257.   }
  258.   else if (key == 't') {
  259.     transparency = !transparency;
  260.   }
  261. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement