# Java - Munger sponge

### Solution of Munger sponge:

#### 4. Drawing board + door sponge code #### 1. How to implement iteration   In order to realize the effect from Figure 1 - > Figure 2 - > Figure 3, we should think of using iteration to realize it

Because a graph like Figure 3 is composed of several basic graphs like Figure 2

So, how to achieve the effect of hollowing?

View 2

2 the cube of the figure can be divided into three layers: There are 8 small cubes in the lower layer, 4 in the middle layer and 8 in the upper layer

So what we're thinking about now is how to draw these three layers of basic graphics

But before painting, let's think about: which layer should be painted first:?

If it is in the order of above, we will get: Obviously, this is not consistent with the graphics we need

So the answer is: down in up

So, the question comes again. What is the order of the small cubes in each layer?

Through the test of the previous problem, we can know that the cube of each layer, the next drawing near us, and the first drawing far away from us can achieve the effect of correct cube stacking

#### 2. How to draw a cube

OK. After confirming the above, let's determine the most basic problem. How to draw a cube?

(x,y) point at the upper left corner of the front face of cube

dx,dy: because we are visually all parallelogram except for the square on the front, so we add an offset value

d: Side length of cube With these values, we can determine the coordinates of each vertex

Color, free play, as long as the color depth: top > right side > front, and

``````//above
int[] xs1={x,x+d,x+d+dx,x+dx};
int[] ys1={y,y,y-dy,y-dy};
g.setColor(new Color(0,50,50));
g.fillPolygon(xs1, ys1, 4);//fillPolygon is to draw a filling polygon. The parameter passed in is the array of x coordinate, the array of y coordinate and the number of vertices

//Right side
int[] xs2={x+d,x+d+dx,x+d+dx,x+d};
int[] ys2={y,y-dy,y-dy+d,y+d};
g.setColor(new Color(0,100,100));
g.fillPolygon(xs2, ys2, 4);

//positive
g.setColor(new Color(0,160,160));
g.fillRect(x, y, d, d);``````

#### 3. Implementation of Munger sponge code

Because the process of drawing cube is to draw the innermost layer first, and then the smallest one can have the effect of superposition, so as long as the iteration is not carried out to the end, we need to continue the iteration, and then draw cube

``````    public void drawSponge(Graphics g,int n,int x,int y,int dx,int dy,int d){
//n is the number of iterations
//Draw from the inside out, from the top down
n--;
if(n>0){
//Lowest layer
drawSponge(g,n,x+2*dx/3,y-2*dy/3+2*d/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+2*dx/3+d/3,y-2*dy/3+2*d/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+2*dx/3+2*d/3,y-2*dy/3+2*d/3,dx/3,dy/3,d/3);

drawSponge(g,n,x+dx/3,y-dy/3+2*d/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+dx/3+2*d/3,y-dy/3+2*d/3,dx/3,dy/3,d/3);

drawSponge(g,n,x,y+2*d/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+d/3,y+2*d/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+2*d/3,y+2*d/3,dx/3,dy/3,d/3);

//Mesosphere
drawSponge(g,n,x+2*dx/3,y-2*dy/3+d/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+2*dx/3+2*d/3,y-2*dy/3+d/3,dx/3,dy/3,d/3);

drawSponge(g,n,x,y+d/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+2*d/3,y+d/3,dx/3,dy/3,d/3);

//Topmost
drawSponge(g,n,x+2*dx/3,y-2*dy/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+2*dx/3+d/3,y-2*dy/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+2*dx/3+2*d/3,y-2*dy/3,dx/3,dy/3,d/3);

drawSponge(g,n,x+dx/3,y-dy/3,dx/3,dy/3,d/3);

drawSponge(g,n,x+dx/3+2*d/3,y-dy/3,dx/3,dy/3,d/3);

drawSponge(g,n,x,y,dx/3,dy/3,d/3);
drawSponge(g,n,x+d/3,y,dx/3,dy/3,d/3);
drawSponge(g,n,x+2*d/3,y,dx/3,dy/3,d/3);
}else{
int[] xs1={x,x+d,x+d+dx,x+dx};
int[] ys1={y,y,y-dy,y-dy};
g.setColor(new Color(0,50,50));
g.fillPolygon(xs1, ys1, 4);

int[] xs2={x+d,x+d+dx,x+d+dx,x+d};
int[] ys2={y,y-dy,y-dy+d,y+d};
g.setColor(new Color(0,100,100));
g.fillPolygon(xs2, ys2, 4);

g.setColor(new Color(0,160,160));
g.fillRect(x, y, d, d);
}
}  ``````

#### 4. Drawing board + door sponge code

We put the Munger sponge on the drawing board

And add the button to realize the effect of drawing according to the coordinates of the points pressed after clicking the button

``````import javax.swing.JFrame;               //forms
import javax.swing.JButton;              //Button

import java.awt.FlowLayout;              //Flow layout
import java.awt.Graphics;                //paint brush

public static void main(String args[]){
dp.showUI();

}

public void showUI(){
JFrame jf = new JFrame();

JButton btn = new JButton("Menger sponge ");
btn.setName("Menger sponge ");
}
FlowLayout fl = new FlowLayout();

jf.setTitle("visualization");                  //name
jf.setSize(800,600);               //size
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    //Shut down process
jf.setLayout(fl);            //Set up flow layout
jf.setResizable(false);      //Cannot change form size
jf.setLocationRelativeTo(null);//Center display
jf.setVisible(true);             //Set form visibility

Graphics g = jf.getGraphics();
dl.g = g;
}

}
``````

``````import java.awt.Color;               //colour
import java.awt.Graphics;            //paint brush
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;//Motion monitor
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener; //Mouse monitor

public class DrawPadListener implements MouseListener, ActionListener{
String btnstr;//String of record button
Graphics g;
int x1,x2,y1,y2;
int n = 1;//Iteration level, change by yourself

public void actionPerformed(ActionEvent e){
btnstr = e.getActionCommand();
System.out.println("actionPerformed Method is called, btnstr Is:"+btnstr);
}

public void mouseClicked(MouseEvent e){
System.out.println("click");
}

public void mousePressed(MouseEvent e){
System.out.println("Press");
x1=e.getX();
y1=e.getY();
}

public void mouseReleased(MouseEvent e){
System.out.println("release");

x2=e.getX();
y2=e.getY();//Release point coordinates

if(btnstr.equals("Menger sponge "))
drawSponge(g,n,x1,y1,99,99,198);//The value can be changed by yourself
//Friendly tips: dx,dy,d try to choose a multiple of 3. Don't let a straight line appear on the sponge
}

public void mouseEntered(MouseEvent e){
System.out.println("get into");
}

public void mouseExited(MouseEvent e){
System.out.println("sign out");
}

public void drawSponge(Graphics g,int n,int x,int y,int dx,int dy,int d){
//Draw from the inside out, from the top down
n--;
if(n>0){
//Lowest layer
drawSponge(g,n,x+2*dx/3,y-2*dy/3+2*d/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+2*dx/3+d/3,y-2*dy/3+2*d/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+2*dx/3+2*d/3,y-2*dy/3+2*d/3,dx/3,dy/3,d/3);

drawSponge(g,n,x+dx/3,y-dy/3+2*d/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+dx/3+2*d/3,y-dy/3+2*d/3,dx/3,dy/3,d/3);

drawSponge(g,n,x,y+2*d/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+d/3,y+2*d/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+2*d/3,y+2*d/3,dx/3,dy/3,d/3);

//Mesosphere
drawSponge(g,n,x+2*dx/3,y-2*dy/3+d/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+2*dx/3+2*d/3,y-2*dy/3+d/3,dx/3,dy/3,d/3);

drawSponge(g,n,x,y+d/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+2*d/3,y+d/3,dx/3,dy/3,d/3);

//Topmost
drawSponge(g,n,x+2*dx/3,y-2*dy/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+2*dx/3+d/3,y-2*dy/3,dx/3,dy/3,d/3);
drawSponge(g,n,x+2*dx/3+2*d/3,y-2*dy/3,dx/3,dy/3,d/3);

drawSponge(g,n,x+dx/3,y-dy/3,dx/3,dy/3,d/3);

drawSponge(g,n,x+dx/3+2*d/3,y-dy/3,dx/3,dy/3,d/3);

drawSponge(g,n,x,y,dx/3,dy/3,d/3);
drawSponge(g,n,x+d/3,y,dx/3,dy/3,d/3);
drawSponge(g,n,x+2*d/3,y,dx/3,dy/3,d/3);

}else{
int[] xs1={x,x+d,x+d+dx,x+dx};
int[] ys1={y,y,y-dy,y-dy};
g.setColor(new Color(0,50,50));
g.fillPolygon(xs1, ys1, 4);

int[] xs2={x+d,x+d+dx,x+d+dx,x+d};
int[] ys2={y,y-dy,y-dy+d,y+d};
g.setColor(new Color(0,100,100));
g.fillPolygon(xs2, ys2, 4);

g.setColor(new Color(0,160,160));
g.fillRect(x, y, d, d);
}
}
}

``````

Tags: Java

Posted on Sat, 13 Jun 2020 21:18:59 -0400 by NeoPuma