我正在编写一个非常类似于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));
我尝试使用相同的代码绘制正方形,除了将height参数更改为等于width参数,因为正方形具有相等的长边:
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轴用鼠标向上移动而不是扩展。
有没有人能指出我关于从两点画广场的逻辑的正确方向?
如果需要,我可以更好地解释我的代码。
答案 0 :(得分: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);
答案 1 :(得分:0)
如果我使用工具绘制正方形,我希望在绘制时我的鼠标光标将保留在正方形的一侧。如果你总是使用x距离作为边,那么如果我向下绘制的距离比横向更远,则光标将位于正方形之外。
我认为,在拖动过程中,代码需要计算距离原点的x距离或距离是否更长,并将其用作正方形的一侧。然后光标将位于其中一侧,并且该侧将延伸到光标之外的正方形角落。
我不知道为什么画面会出错 - 很难确定我明白你说错了什么。