我更喜欢使用我自己的方法在 Java 中绘制东西。我使用这两种方法来填充一个矩形:
public static void drawPixel(Vector2 position) {
g.drawLine((int) position.getX(), (int) position.getY(), (int) position.getX(), (int) position.getY());
}
public static void fill(Rectangle area) {
for (int x = (int) area.getTopLeft().getX(); x <= (int) area.getBottomRight().getX(); x++) {
for (int y = (int) area.getTopLeft().getY(); y <= (int) area.getBottomRight().getY(); y++) {
drawPixel(new Vector2(x, y));
}
}
}
当我使用这种填充方法来填充窗口的每一帧以绘制背景时,它变得非常慢。我可以做些什么来优化它?
我也是用自己的画线方法,为了避免自己电脑出现画线不准的BUG。 自定义行方法:
public static void drawLine(Line line) {
double x2 = line.getEnd().getX(), x1 = line.getStart().getX(), y2 = line.getEnd().getY(), y1 = line.getStart().getY();
// delta of exact value and rounded value of the dependent variable
int d = 0;
int dy = (int) Math.abs(y2 - y1);
int dx = (int) Math.abs(x2 - x1);
int dy2 = (dy << 1); // slope scaling factors to avoid floating
int dx2 = (dx << 1); // point
int ix = x1 < x2 ? 1 : -1; // increment direction
int iy = y1 < y2 ? 1 : -1;
if (dy <= dx) {
for (;;) {
drawPixel(new Vector2(x1, y1));
if (x1 == x2)
break;
x1 += ix;
d += dy2;
if (d > dx) {
y1 += iy;
d -= dx2;
}
}
} else {
for (;;) {
drawPixel(new Vector2(x1, y1));
if (y1 == y2)
break;
y1 += iy;
d += dx2;
if (d > dy) {
x1 += ix;
d -= dy2;
}
}
}
}
最佳答案
使用drawLine
绘制单个像素似乎不是一个好主意。为什么不直接使用 drawLine
来绘制线条,从而移除内部循环?
我对 JAVA 一点都不懂,但我突然想到,从循环测试条件内部调用一个方法,只是为了检查索引变量是否已达到最终值,这对我来说似乎是一个很大的开销.我宁愿使用一个变量来缓存相关值,它不会改变,并在测试条件下使用它。
public static void fill(Rectangle area) {
int y1 = (int) area.getTopLeft().getY();
int y2 = (int) area.getBottomRight().getY();
int x2 = (int) area.getBottomRight().getX();
for (int x = (int) area.getTopLeft().getX(); x <= x2; x++) {
g.drawLine (x, y1, x, y2);
}
}
关于Java - 填充矩形的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29196697/