-1

我正在编写一个非常模仿 Microsoft Paint 的 Java 程序。它可以绘制四种不同的形状:直线、椭圆、矩形和正方形。我非常接近完成这个,但我坚持绘制正方形的逻辑。

绘制这些形状时涉及两个点。第一个 Point(point1) 是用户按下鼠标按钮时,第二个 Point(point2) 是用户在画布上拖动鼠标时。我相信绘制矩形和正方形应该非常相似,但让我感到困惑的部分是在绘制正方形时,边长相等,所以 point2 并不完全是鼠标所在的位置。

这是 fillRect() 方法头供参考:

fillRect(x, y, width, height)

我绘制矩形的功能代码如下:

g.fillRect((((point1.x < point2.x) ? point1.x : point2.x)),
            ((point1.y < point2.y) ? point1.y : point2.y), 
            Math.abs(point2.x - point1.x), 
            Math.abs(point2.y - point1.y));

我尝试使用相同的代码来绘制正方形,除了将高度参数更改为等于宽度参数,因为正方形的边长相等:

g.fillRect((((point1.x < point2.x) ? point1.x : point2.x)), 
            ((point1.y < point2.y) ? point1.y : point2.y), 
            Math.abs(point2.x - point1.x), 
            Math.abs(point2.x - point1.x)); //same as width

我不知道使宽度和高度相等的问题是什么。它在向左或向右向下绘制时起作用,但如果你直接向下拉,形状当然不会扩大。单击并向上拖动不起作用;正方形只是用鼠标沿 Y 轴向上移动,而不是扩展。

关于从两点绘制正方形的逻辑,有人能指出我正确的方向吗?

如果需要,我可以更好地解释我的代码。

4

2 回答 2

0

您应该在 MouseDragged 方法中进行两次计算——首先您应该计算矩形的两个角点 p1 和 p2,然后才应该计算宽度。点 p1 很简单——它总是第一个被按下的点,但是 p2 需要一个简单的计算。一旦澄清了这些,您的计算应该正确。

即,类似:

  int width = Math.abs(pointA.x - pointB.x);
  int height = Math.abs(pointA.y - pointB.y);

  width = Math.max(width, height);
  height = width;

  int x = pointA.x > pointB.x ? pointA.x - width : pointA.x;
  int y = pointA.y > pointB.y ? pointA.y - width : pointA.y;

  g.fillRect(x, y, width, height);
于 2013-11-10T02:38:47.523 回答
0

如果我使用工具绘制正方形,我希望鼠标光标在绘制时会停留在正方形的一侧。如果您始终使用 x 距离作为边,那么如果我向下绘制的距离比横向更远,则光标将位于正方形之外。

我认为,在拖动过程中,代码需要计算到原点的 x 距离或 y 距离是否更长,并将其用作进行中正方形的一侧。然后光标将位于其中一侧,并且该侧将超出光标延伸到正在进行的正方形的角落。

我不知道为什么这幅画会出错——很难确定我理解你所说的出错了。

于 2013-11-10T02:50:11.547 回答