画线函数

时间:2016-05-08 14:20:47

标签: java

我想创建一个drawLine函数,但是我无法使用任何图形类(我可以设置像素)。我尝试了这种方法https://en.wikipedia.org/wiki/Bresenham's_line_algorithm#Method,但这仅适用于线从左上角到右下角而不是从右上角到左下角的情况。有没有人有办法做到这一点?我目前的代码:

public void drawLine(int startX, int startY, int endX, int endY) {
    double deltaX = endX - startX;
    double deltaY = endY - startY;
    double error = -1;
    double deltaError = Math.abs(deltaY / deltaX);
    int y = startY;

    for (int x = startX; x < endX - 1; x++) {
        error += deltaError;

        if (error >= 0) {
            y++;
            error--;
        }

        drawPixel(x, y);
    }
}

感谢任何帮助。

我解决了。最终的结果就是这个。

public void drawLine(int startX, int startY, int endX, int endY) {
    if (startX > endX && startY > endY) {
        int startXCopy = startX;
        startX = endX;
        endX = startXCopy;

        int startYCopy = startY;
        startY = endY;
        endY = startYCopy;
    }

    double deltaX = endX - startX;
    double deltaY = endY - startY;
    double error = -1;
    double deltaError = Math.abs(deltaY / deltaX);

    if (deltaX == 0) {
        for (int y = startY; y < endY; y++)
            drawPixel(startX, y);
    }

    if (deltaY == 0) {
        for (int x = startX; x < endX; x++)
            drawPixel(x, startY);
    }

    if (deltaX >= deltaY) {
        int y = startY;
        int yDirection = endY > startY ? 1 : -1;

        for (int x = startX; x < endX - 1; x++) {
            error += deltaError;

            if (error >= 0) {
                y += yDirection;
                error--;
            }

            drawPixel(x, y);
        }
    } else if (deltaY > deltaX) {
        int x = startX;
        int xDirection = endX > startX ? 1 : -1;

        for (int y = startY; y < endY - 1; y++) {
            error += deltaError;

            if (error >= 0) {
                x += xDirection;
                error--;
            }

            drawPixel(x, y);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

绘制线条是一个简单的数学问题,可以通过不同的方式实现。 你需要的是基本的线性euqation b$.withLatestFrom(a$, function (b,a){return a+b}) .subscribe(a) 其中y = f(x) = mx + b是您的斜率,定义为mm=(y2−y1)/(x2−x1)是您的起始值,bx表示,其中x = x_i - startX是您的您现在的当前点。然后,您可以计算起点和终点之间的线上每个x_i值的所有y值。点数取决于分辨率因子。

x_i