门格海绵绘制

张开发
2026/4/20 21:24:28 15 分钟阅读

分享文章

门格海绵绘制
依旧在3D图形绘制的基础上可以通过小方块的堆叠以及位置安排画出门格海绵类似结构门格海绵的每层结构与谢尔宾斯基地毯类似需要用到递归完成于是我们需要写一个绘制门格海绵的方法思路定义DrawMengerSponge类并继承JFrame窗口初始化定义drawMS方法传入参数g,x,y,w,h,dx,dy拆分出单独的一个方块可以看出每一个小单元是由以下部分组成下层八个立方体中间层四个立方体上层八个立方体点的定义参考这个图我们可以算出这20个点的坐标确定小3D矩形的位置递归终止的条件w20此时调用20个draw3DRect方法沿用前文绘制3D矩形的方法绘制20个小3D矩形如果w20说明还未达到最小绘制单元递归调用drawMS方法以这些定义好的点为起始点按照相同的方式在更小的区域内绘制门格海绵在绘图方法paint中调用drawMS方法输入x,y,w,h,dx,dy实现门格海绵的绘制import javax.swing.*; import java.awt.*; public class DrawMengerSponge extends JFrame { public void showUI(){ setTitle(门格海绵); setSize(900,900); setDefaultCloseOperation(EXIT_ON_CLOSE); FlowLayout flnew FlowLayout(); setLayout(fl); setLocationRelativeTo(null); setVisible(true); } public void paint(Graphics g) { super.paint(g); drawMs(g, 100, 300, 500, 500, 100, 100); } public void draw3DRect(Graphics g,int x,int y,int w,int h,int dx,int dy){ Point p1new Point(x,y); Point p2new Point(xw,y); Point p3new Point(xw,yh); Point p4new Point(x,yh); Point p5new Point(x-dx,y-dy); Point p6new Point(p5.xw,p5.y); Point p7new Point(p6.x,p6.yh); Point p8new Point(p5.x,p5.yh); //多边形类 Polygon pyg1new Polygon(); pyg1.addPoint(p1.x,p1.y); pyg1.addPoint(p2.x,p2.y); pyg1.addPoint(p3.x,p3.y); pyg1.addPoint(p4.x,p4.y); Polygon pyg2new Polygon(); pyg2.addPoint(p1.x,p1.y); pyg2.addPoint(p5.x,p5.y); pyg2.addPoint(p6.x,p6.y); pyg2.addPoint(p2.x,p2.y); Polygon pyg3new Polygon(); pyg3.addPoint(p2.x,p2.y); pyg3.addPoint(p6.x,p6.y); pyg3.addPoint(p7.x,p7.y); pyg3.addPoint(p3.x,p3.y); Color color1 new Color(182, 157, 157); Color color2 new Color(90, 76, 76); Color color3 new Color(170, 102, 102); g.setColor(color1); g.fillPolygon(pyg1); g.setColor(color2); g.fillPolygon(pyg2); g.setColor(color3); g.fillPolygon(pyg3); } public void drawMs(Graphics g,int x,int y,int w,int h,int dx,int dy) { Point p1 new Point(x dx, y - dy / 3 2 * h / 3); Point p2 new Point(p1.x w / 3, p1.y); Point p3 new Point(p2.x w / 3, p1.y); Point p4 new Point(p1.x - dx / 3, p1.y dy / 3); Point p5 new Point(p4.x 2 * w / 3, p4.y); Point p6 new Point(x dx / 3, p4.y dy / 3); Point p7 new Point(p6.x w / 3, p6.y); Point p8 new Point(p6.x 2 * w / 3, p6.y); Point p9 new Point(p1.x, p1.y - h / 3); Point p10 new Point(p9.x 2 * w / 3, p9.y); Point p11 new Point(p6.x, p6.y -h / 3); Point p12 new Point(p8.x, p8.y - h / 3); Point p13 new Point(p1.x, p9.y - h / 3); Point p14 new Point(p2.x, p2.y - 2 * h / 3); Point p15 new Point(p3.x, p3.y - 2 * h / 3); Point p16 new Point(p4.x, p4.y - 2 * h / 3); Point p17 new Point(p5.x, p5.y - 2 * h / 3); Point p18 new Point(p6.x, p6.y - 2 * h / 3); Point p19 new Point(p7.x, p7.y - 2 * h / 3); Point p20 new Point(p8.x, p8.y - 2 * h / 3); if(w20) { draw3DRect(g, p1.x, p1.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p2.x, p2.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p3.x, p3.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p4.x, p4.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p5.x, p5.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p6.x, p6.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p7.x, p7.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p8.x, p8.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p9.x, p9.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p10.x, p10.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p11.x, p11.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p12.x, p12.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p13.x, p13.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p14.x, p14.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p15.x, p15.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p16.x, p16.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p17.x, p17.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p18.x, p18.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p19.x, p19.y, w / 3, h / 3, dx / 3, dy / 3); draw3DRect(g, p20.x, p20.y, w / 3, h / 3, dx / 3, dy / 3); return; } drawMs(g,p1.x,p1.y,w/3,h/3,dx/3,dy/3); drawMs(g,p2.x,p2.y,w/3,h/3,dx/3,dy/3); drawMs(g,p3.x,p3.y,w/3,h/3,dx/3,dy/3); drawMs(g,p4.x,p4.y,w/3,h/3,dx/3,dy/3); drawMs(g,p5.x,p5.y,w/3,h/3,dx/3,dy/3); drawMs(g,p6.x,p6.y,w/3,h/3,dx/3,dy/3); drawMs(g,p7.x,p7.y,w/3,h/3,dx/3,dy/3); drawMs(g,p8.x,p8.y,w/3,h/3,dx/3,dy/3); drawMs(g,p9.x,p9.y,w/3,h/3,dx/3,dy/3); drawMs(g,p10.x,p10.y,w/3,h/3,dx/3,dy/3); drawMs(g,p11.x,p11.y,w/3,h/3,dx/3,dy/3); drawMs(g,p12.x,p12.y,w/3,h/3,dx/3,dy/3); drawMs(g,p13.x,p13.y,w/3,h/3,dx/3,dy/3); drawMs(g,p14.x,p14.y,w/3,h/3,dx/3,dy/3); drawMs(g,p15.x,p15.y,w/3,h/3,dx/3,dy/3); drawMs(g,p16.x,p16.y,w/3,h/3,dx/3,dy/3); drawMs(g,p17.x,p17.y,w/3,h/3,dx/3,dy/3); drawMs(g,p18.x,p18.y,w/3,h/3,dx/3,dy/3); drawMs(g,p19.x,p19.y,w/3,h/3,dx/3,dy/3); drawMs(g,p20.x,p20.y,w/3,h/3,dx/3,dy/3); } public static void main(String[] args) { DrawMengerSponge dmsnew DrawMengerSponge(); dms.showUI(); } }

更多文章