如何从头开始获得线坐标?

时间:2019-05-03 03:10:17

标签: java math graphics logic 2d

首先,我想说的不是语法相关的问题,而是理论相关的问题(我也正在使用Java,但是无论语言如何,问题/答案都应该相同)。我想要一个具有参数x1,y1,x2,y2(均为整数)的函数。该函数将采用这些并编辑一个称为pixelData [] []的二维数组(也是整数)。线占据的每个坐标将以以下格式添加到pixelData:pixelData [x] [y];

例如:如果函数正常工作,我使用以下参数调用了它:

int pixelData[][][];
pixelData = new int[10][10]; //grid size of 10x10;

x1 = 1;
y1 = 1;
x2 = 3;
y2 = 3;

该函数会将以下值放入像素数据:

pixelData[1][1] = 1;
pixelData[2][2] = 1;
pixelData[3][3] = 1;

对于数学,我最初的方法是取x1-x2的绝对值和y1-y2的绝对值,并将它们分别称为xLength和yLength。然后,我将两个比率(xLength / yLength)存储在一个名为xyRatio的双精度中。那么,对于每个xyRatio x运动,都会有1个y运动。问题在于,这仅适用于少数线角,并且大多数情况下只会产生不准确的坐标。例如,如果比率小于1,则每当y轴更改时,x轴的0更改都会打开,并且还会出现类似的问题。如果有人可以给我一个公式或一些帮助,那就太好了。

如果您需要对问题进行任何澄清,请提出。预先感谢!

P.S。我知道drawLine函数,但是我不想简单地绘制 这条线,我想要每个坐标的映射。如果存在 函数执行我需要的功能,然后请告诉我。

-Ampck

1 个答案:

答案 0 :(得分:1)

您需要一些line rasterization的算法。

例如,寻找最流行的Bresenham's算法

Rosetta code的实现(用数组条目填充代替plot

private void drawLine(Graphics g, int x1, int y1, int x2, int y2) {
        // delta of exact value and rounded value of the dependent variable
        int d = 0;

        int dx = Math.abs(x2 - x1);
        int dy = Math.abs(y2 - y1);

        int dx2 = 2 * dx; // slope scaling factors to
        int dy2 = 2 * dy; // avoid floating point

        int ix = x1 < x2 ? 1 : -1; // increment direction
        int iy = y1 < y2 ? 1 : -1;

        int x = x1;
        int y = y1;

        if (dx >= dy) {
            while (true) {
                plot(g, x, y);
                if (x == x2)
                    break;
                x += ix;
                d += dy2;
                if (d > dx) {
                    y += iy;
                    d -= dx2;
                }
            }
        } else {
            while (true) {
                plot(g, x, y);
                if (y == y2)
                    break;
                y += iy;
                d += dx2;
                if (d > dy) {
                    x += ix;
                    d -= dy2;
                }
            }
        }
    }
}