门格海绵

最终效果:

3D谢尔宾斯基地毯

实现思路:

  1. 分割为一块一块的正方体去构建,每构建一块正方体,对其进行递归操作,实现“海绵”的效果

  2. 对于每一块正方体,通过画三个面实现正方体的展现

代码实现:

  1. 构建每一个正方体

   通过Polygon,添入各个点,实现三个面的颜色填充,使其呈现为一个正方体

   **<u>值得注意的是,要沿同一方向(顺/逆时针)来加入点,否则会导致填充错误!</u>**
  1. 随后,对这个正方体构建门格海绵,通过递归来使这个正方体形成海绵的样子

  2. 以此类推,从后到前、从下到上的去构建每一个正方体,最后拼接形成一整个门格海绵

1
2
3
4
5
//paint()函数:
public void paint(Graphics g){
super.paint(g);
DrawSponge(300,300,200,200,50,50,g);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Draw3DRect()函数:
public void Draw3DRect(int x,int y,int w,int h,int dx,int dy,Graphics g){
Point point1= new Point(x,y);
Point point2= new Point(x+w,y);
Point point3= new Point(x+w,y+h);
Point point4= new Point(x,y+h);
Point point5= new Point(x+dx,y-dy);
Point point6= new Point(point2.x+dx, point2.y-dy);
Point point7= new Point(point6.x, point6.y+h);

Polygon pl1 = new Polygon();
pl1.addPoint(point1.x, point1.y);
pl1.addPoint(point2.x, point2.y);
pl1.addPoint(point3.x, point3.y);
pl1.addPoint(point4.x, point4.y);
Color color1 = new Color(166,157,11);
g.setColor(color1);
g.fillPolygon(pl1);
// 另两面的构造方法同上~
1
2
3
4
5
6
//DrawSponge()函数:
public void DrawSponge(int x,int y,int w,int h,int dx,int dy,Graphics g){
Draw3DRect(某一个正方体)
DrawSponge(同一个正方体)
// 共有20个正方体按此方法来构造
}

对于DrawSponge()函数:

每次构造都从左前下方的正方体开始构造,所以对于某一小正方体进行门格海绵的构造时,要注意起始正方体的坐标

完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
public class MSponge extends JFrame {
public MSponge(){
setTitle("门格海绵");
setSize(1000,1000);
setResizable(true);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}

@Override
public void paint(Graphics g){
super.paint(g);
DrawSponge(500,500,200,200,50,50,g);
}

public void Draw3DRect(int x,int y,int w,int h,int dx,int dy,Graphics g){
Point point1= new Point(x,y);
Point point2= new Point(x+w,y);
Point point3= new Point(x+w,y+h);
Point point4= new Point(x,y+h);
Point point5= new Point(x+dx,y-dy);
Point point6= new Point(point2.x+dx, point2.y-dy);
Point point7= new Point(point6.x, point6.y+h);

Polygon pl1 = new Polygon();
pl1.addPoint(point1.x, point1.y);
pl1.addPoint(point2.x, point2.y);
pl1.addPoint(point3.x, point3.y);
pl1.addPoint(point4.x, point4.y);
Color color1 = new Color(217,218,11);
g.setColor(color1);
g.fillPolygon(pl1);
g.setColor(Color.gray);
g.drawPolygon(pl1);

Polygon pl2 = new Polygon();
pl2.addPoint(point1.x, point1.y);
pl2.addPoint(point5.x, point5.y);
pl2.addPoint(point6.x, point6.y);
pl2.addPoint(point2.x, point2.y);
Color color2 = new Color(14,150,4);
g.setColor(color2);
g.fillPolygon(pl2);
g.setColor(Color.gray);
g.drawPolygon(pl2);

Polygon pl3 = new Polygon();
pl3.addPoint(point2.x, point2.y);
pl3.addPoint(point6.x, point6.y);
pl3.addPoint(point7.x, point7.y);
pl3.addPoint(point3.x, point3.y);
Color color3 = new Color(18,49,74);
g.setColor(color3);
g.fillPolygon(pl3);
g.setColor(Color.gray);
g.drawPolygon(pl3);
}
public void DrawSponge(int x,int y,int w,int h,int dx,int dy,Graphics g){
if(w<10) return;
Draw3DRect(x,y,w,h,dx,dy,g);
DrawSponge(x+2*dx/3,y-2*dy/3+2*h/3,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x+w,y,w,h,dx,dy,g);
DrawSponge(x+w+2*dx/3,y-2*dy/3+2*h/3,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x+2*w,y,w,h,dx,dy,g);
DrawSponge(x+2*w+2*dx/3,y-2*dy/3+2*h/3,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x-dx,y+dy,w,h,dx,dy,g);
DrawSponge(x+2*dx/3-dx,y-2*dy/3+2*h/3+dy,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x-dx+2*w,y+dy,w,h,dx,dy,g);
DrawSponge(x+2*w+2*dx/3-dx,y-2*dy/3+2*h/3+dy,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x-2*dx,y+2*dy,w,h,dx,dy,g);
DrawSponge(x+2*dx/3-2*dx,y-2*dy/3+2*h/3+2*dy,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x-2*dx+w,y+2*dy,w,h,dx,dy,g);
DrawSponge(x+2*dx/3-2*dx+w,y-2*dy/3+2*h/3+2*dy,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x-2*dx+2*w,y+2*dy,w,h,dx,dy,g);
DrawSponge(x+2*dx/3-2*dx+2*w,y-2*dy/3+2*h/3+2*dy,w/3,h/3,dx/3,dy/3,g);
/////////////////////底层构建完成
Draw3DRect(x,y-h,w,h,dx,dy,g);
DrawSponge(x+2*dx/3,y-2*dy/3+2*h/3-h,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x+2*w,y-h,w,h,dx,dy,g);
DrawSponge(x+2*w+2*dx/3,y-2*dy/3+2*h/3-h,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x-2*dx,y+2*dy-h,w,h,dx,dy,g);
DrawSponge(x+2*dx/3-2*dx,y-2*dy/3+2*h/3+2*dy-h,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x-2*dx+2*w,y+2*dy-h,w,h,dx,dy,g);
DrawSponge(x+2*dx/3-2*dx+2*w,y-2*dy/3+2*h/3+2*dy-h,w/3,h/3,dx/3,dy/3,g);
///////////////////////中层构建完成
Draw3DRect(x,y-2*h,w,h,dx,dy,g);
DrawSponge(x+2*dx/3,y-2*dy/3+2*h/3-2*h,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x+w,y-2*h,w,h,dx,dy,g);
DrawSponge(x+w+2*dx/3,y-2*dy/3+2*h/3-2*h,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x+2*w,y-2*h,w,h,dx,dy,g);
DrawSponge(x+2*w+2*dx/3,y-2*dy/3+2*h/3-2*h,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x-dx,y+dy-2*h,w,h,dx,dy,g);
DrawSponge(x+2*dx/3-dy,y-2*dy/3+2*h/3-2*h+dy,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x-dx+2*w,y+dy-2*h,w,h,dx,dy,g);
DrawSponge(x+2*w+2*dx/3-dx,y-2*dy/3+2*h/3-2*h+dy,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x-2*dx,y+2*dy-2*h,w,h,dx,dy,g);
DrawSponge(x+2*dx/3-2*dx,y-2*dy/3+2*h/3+2*dy-2*h,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x-2*dx+w,y+2*dy-2*h,w,h,dx,dy,g);
DrawSponge(x+2*dx/3-2*dx+w,y-2*dy/3+2*h/3+2*dy-2*h,w/3,h/3,dx/3,dy/3,g);

Draw3DRect(x-2*dx+2*w,y+2*dy-2*h,w,h,dx,dy,g);
DrawSponge(x+2*dx/3-2*dx+2*w,y-2*dy/3+2*h/3+2*dy-2*h,w/3,h/3,dx/3,dy/3,g);
/////////////////////上层构建完成
}

public static void main(String[] args) {
new MSponge();
}
}

成品:

成品