简体   繁体   中英

Drawing rectangle and grid

I would be very thankful if someone could help me.

My program has 2 classes. One draws a rectangle and a grid, the other is a viewer. The problem is, when I try to change the position for the greed+rectangle, ie update X and Y constants in the Viewer class, the proportions change. The grid fits in only when X=0 and Y=0.

I'm using the same arrays of coordinates to draw the grid and the rectangle, but somehow the proportions are wrong, which surprises me.

Thank you.

My code:

import java.applet.Applet;
import java.awt.Graphics;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.math.BigDecimal;


public class Viewer extends Applet {
  public static final double R_WDTH = 12;//rectangle width
  public static final double X = 10;//the grid fits in only when X=Y=0
  public static final double Y = 10;
  public static final int ROWS = 25;
  public static final int COLUMNS = 12;

  RectangleAndGrid cup = new RectangleAndGrid(X, Y, R_WDTH, ROWS, COLUMNS);

  public void paint(Graphics g) {
    cup.draw((Graphics2D)g);
  }
}


public class RectangleAndGrid {
  private double x, y, blockWidth;
  private int rows, columns;
  private double coordX[][], coordY[][];
  private Rectangle2D.Double cupSpace;

  public RectangleAndGrid(double cX, double cY, double givenBlockWidth, int r, int c){
    x = cX;
    y = cY;
    blockWidth = givenBlockWidth;
    rows = r;
    columns = c;

    BigDecimal currX = BigDecimal.valueOf(x);
    BigDecimal currY = BigDecimal.valueOf(y);
    coordX = new double[rows + 1][columns + 1];
    coordY = new double[rows + 1][columns + 1];
    for(int i = 0; i <= rows; i++){
      for(int j = 0; j <= columns; j++){
        coordX[i][j] = currX.doubleValue();
        coordY[i][j] = currY.doubleValue();
        currX = currX.add(BigDecimal.valueOf(blockWidth));
      }
      currX = BigDecimal.valueOf(x);
      currY = currY.add(BigDecimal.valueOf(blockWidth));
    }

    cupSpace = new Rectangle2D.Double(coordX[0][0], coordY[0][0], coordX[rows][columns], coordY[rows][columns]);
  }

  public void draw(Graphics2D g2d){
    g2d.setColor(Color.CYAN);
    g2d.fill(cupSpace);
    g2d.setColor(Color.BLACK);
    g2d.draw(cupSpace);

    Line2D.Double line = new Line2D.Double();
    for(int i = 0; i <= rows; i++){
      line.setLine(coordX[i][0], coordY[i][0], coordX[i][columns], coordY[i][columns]);
      g2d.draw(line);
    }
    for(int i = 0; i <= columns; i++){
      line.setLine(coordX[0][i], coordY[0][i], coordX[rows][i], coordY[rows][i]);
      g2d.draw(line);
    }
  }
}

Firstly, your approach is a "little" weird, not entirely bad, just a little weird - IMHO

Rectangle2D takes four parameters, x , y , width and height . In you code you are passing the top, left and bottom right corners of your grid, this means, the width/height of your "cup" is actually wider by x pixels (and y pixels higher)

Basically, you need to subtract the x / y offset from the bottom right coordinates...

cupSpace = new Rectangle2D.Double(coordX[0][0], coordY[0][0], coordX[rows][columns] - coordX[0][0], coordY[rows][columns] - coordY[0][0]);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM