绘画代码:
double m = 0;
int width = draggedX - mouseX;
int height = draggedY - mouseY;
if(draggedX - mouseX != 0){
m = (double) (draggedY - mouseY) / (double) (draggedX - mouseX);
}
if(width > 0){
for(int i = 0; i < width; i++) {
double x = mouseX + i;
double y = mouseY + (m * i);
g.fillOval((int) x, (int) y, 5, 5);
}
}
else if(width < 0){
for(int i = -width; i > 0; i--) {
double x = mouseX - i;
double y = mouseY - (m * i);
g.fillOval((int) x, (int) y, 5, 5);
}
}
else{
if(height > 0){
for(int i = 0; i < height; i++){
g.fillOval(mouseX, (int) i + mouseY, 5, 5);
}
}
else if(height < 0){
for(int i = -height; i > 0; i--){
g.fillOval(mouseX, (int) i - mouseY, 5, 5);
}
}
else{
g.fillOval(mouseX, mouseY, 5, 5);
}
}
答案 0 :(得分:1)
鼠标事件很棘手,它们并不总是遵循线性进展。我不会使用椭圆,而是简单地在每个不同的事件点之间绘制线条。如果你需要使线条变粗,请看一下Stroke(或特别是BasicStroke)
例如Resize the panel without revalidation
使用getGraphics
代替使用paintComponent
答案 1 :(得分:0)
假设你绘制一条接近垂直的行,宽度= 10,高度= 200.使用给定的循环,你将精确绘制10个点,这不足以覆盖整行。
要解决此问题,您需要检查身高&gt;宽度,在这种情况下,绘制点“垂直”,沿y轴迭代。
// when height > width
for(int i = 0; i < height; i++) {
double x = mouseX + i/m;
double y = mouseY + i;
g.fillOval((int) x, (int) y, 5, 5);
}
正如您所看到的,绘制单条线的算法变得非常复杂。这就是为什么Bresenham's algorithm是如此重要的原因。