0

誰かが私を助けてくれたらとてもありがたいです。

私のプログラムには2つのクラスがあります。1 つは長方形とグリッドを描画し、もう 1 つはビューアです。問題は、貪欲+長方形の位置を変更しようとすると、つまり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

まず、あなたのアプローチは「少し」奇妙で、完全に悪いわけではなく、少し奇妙です-IMHO

Rectangle2Dxは、 、ywidthおよびの 4 つのパラメータを取りますheight。あなたのコードでは、グリッドの上、左、右下の角を渡しています。これは、「カップ」の幅/高さが実際にはxピクセル単位で広い (そしてyピクセルが大きい)ことを意味します。

基本的に、右下の座標から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 に答える