首先,我想说的不是语法相关的问题,而是理论相关的问题(我也正在使用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
答案 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;
}
}
}
}
}