0

如果有人可以帮助我,我将非常感激。

我的程序有 2 节课。一个绘制矩形和网格,另一个是查看器。问题是,当我尝试更改贪婪+矩形的位置时,即更新 Viewer 类中的 X 和 Y 常量时,比例会发生变化。只有当 X=0 和 Y=0 时,网格才适合。

我使用相同的坐标数组来绘制网格和矩形,但不知何故,比例是错误的,这让我感到惊讶。

谢谢你。

我的代码:

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

1 回答 1

3

首先,您的方法“有点”怪异,并非完全糟糕,只是有点怪异-恕我直言

Rectangle2D接受四个参数,xywidthheight。在您的代码中,您正在传递网格的左上角和右下角,这意味着“杯子”的宽度/高度实际上比像素更宽xy像素更高)

基本上,您需要从右下角坐标中减去x/偏移量...y

cupSpace = new Rectangle2D.Double(coordX[0][0], coordY[0][0], coordX[rows][columns] - coordX[0][0], coordY[rows][columns] - coordY[0][0]);
于 2013-01-08T01:22:49.397 回答