用Java递归绘制图形



对于这个程序,我需要递归地绘制一个"宝塔",它是一系列递减的矩形,居中对齐,堆叠在一起。我想我已经了解了实际图形背后的逻辑,但我很难弄清楚如何使用Graphics2D将图形绘制为矩形。我试着把它硬塞进一个基本的形状绘制程序中,却找不到如何在其中递归

这是我在这一点上写的代码,没有考虑图形:

import java.awt.Rectangle;

public class PagodaDrawer
{
private int initialY; //Top of the bottom rectangle
private int initialHeight; //Height for the bottom rectangle
private double scale; //Amount to reduce each layer

public PagodaDrawer(int initialY, int initialHeight, double scaleFactor)
{
    this.initialY = initialY;
    this.initialHeight = initialHeight;
    scale = scaleFactor;
}
public void drawPagoda()
{
    drawLayer(0, initialY, 2 * initialHeight, initialHeight);
}
public void drawLayer(double x, double y, double width, double height)
{
    if(y < 0 || height < 5) //If off the top of the screen, or less than 5 tall
    {
        return;
    }
    drawLayer(x - (((1 - scale)* x) / 2), y + (y * scale), width * scale, height * scale );
    Rectangle r = new Rectangle((int)x, (int)y, (int)(2 * height), (int)height);
    //Draw r?
}
}

如何在一个框架中递归绘制图形的层?

编辑:

对于任何感兴趣的人来说,这是的最终代码

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PagodaDrawer extends JPanel
{
private int initialX;
private int initialY; //Top of the bottom rectangle
private int initialHeight; //Height for the bottom rectangle
private double scale; //Amount to reduce each layer
private boolean isRenderable;
private ArrayList<Rectangle> recs;

public PagodaDrawer(int initialX, int initialY, int initialHeight, double scaleFactor)
{
    this.initialX = initialX;
    this.initialY = initialY;
    this.initialHeight = initialHeight;
    scale = scaleFactor;
    isRenderable = false;
    recs = new ArrayList<Rectangle>();
}
public void drawPagoda()
{
    drawLayer(initialX, initialY, 2 * initialHeight, initialHeight);
}
public void drawLayer(double x, double y, double width, double height)
{
    if(y < 0 || height < 5) //If off the top of the screen, or less than 5 tall
    {
        isRenderable = true;
        return;
    }
    drawLayer(x + .5 * (width - (width * scale)), y - (height * scale), width * scale, height * scale );
    Rectangle r = new Rectangle((int)x, (int)y, (int)(2 * height), (int)height);
    recs.add(r);
}
public void paintComponent(Graphics g)
{
    if(!isRenderable)
        return;
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    for(int i = 0; i < recs.size(); i++)
    {
        g2.draw(recs.get(i));
        System.out.println(recs.get(i));
    }
}
}

与此JFrame:耦合

import javax.swing.JFrame;
import javax.swing.JPanel;

public class DisplayComponent extends JFrame
{
private static final long serialVersionUID = -4279682826771265863L;
private static final int FRAME_WIDTH = 500;
private static final int FRAME_HEIGHT = 500;
private JPanel panel;
private PagodaDrawer p;
public DisplayComponent(int initialHeight, double scaleFactor)
{
    p = new PagodaDrawer(FRAME_WIDTH / 2, FRAME_HEIGHT, initialHeight, scaleFactor);
    panel = new JPanel();
    p.drawPagoda();
    add(p);
    pack();

    setSize(FRAME_WIDTH, FRAME_HEIGHT);
    setVisible(true);
}
}

与其使drawLayer()递归,不如编写一个递归createRectangle(),将每个新的Rectangle实例添加到List<Rectangle>中。在paintComponent()的实现中呈现列表,如图所示。

在Java AWT和Swing中,您可以使用Graphics/Graphics2D方法进行绘制
示例:graphics.fillRect(x, y, w, h);

应该从要绘制到的组件(通常是主框架或某个组件)中获取graphics(?:2d)对象。

在框架的paintComponent()内调用绘图应该可以像这样工作:

如何在Java中使用paintComponent绘制多个东西,但旋转一个?

以下是Java6文档:http://docs.oracle.com/javase/6/docs/api/

相关内容

  • 没有找到相关文章

最新更新