2013-11-30 5 views
1

Для этой программы мне требуется рекурсивно нарисовать «пагоду», которая представляет собой серию уменьшающихся прямоугольников, выровненных по центру, расположенных друг над другом. Я думаю, что я получил логику позади фактической фигуры, но мне трудно понять, как на самом деле получить фигуру, нарисованную как Rectangles с Graphics2D. Я попытался перевернуть его в базовую программу рисования фигуры и не смог узнать, как работать с ней в рекурсии.Рекурсивно рисовать графику в Java

Это код, который я написал в этой точке, не принимая во внимание графики:

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? 
} 
} 

Как я могу рекурсивно рисовать слои фигуры в кадре?

EDIT:

Для любого заинтересованного, это окончательный код

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); 
} 
} 

ответ

2

Вместо того, чтобы drawLayer() рекурсивной, написать рекурсивную createRectangle(), добавляющий каждый новый Rectangle экземпляр для List<Rectangle>. Отобразите список в вашей реализации paintComponent(), проиллюстрированный here.

1

В Java AWT и Swing вы рисуете с помощью Graphics/Graphics2D методов.
Пример: graphics.fillRect(x, y, w, h);

Вы должны получить graphics(?:2d) объект из компонент, в котором вы хотите рисовать в, как правило, основной кадр или какого-либо компонента.

Вызов рисунков в пределах paintComponent() кадра должно работать так:

How to use paintComponent in Java to paint multiple things, but rotate one?

Вот это Java6 документы: http://docs.oracle.com/javase/6/docs/api/

Смежные вопросы