如何从头开始获取线坐标?
How do I get line coordinates from scratch?
首先,我想说这不是一个语法相关的问题,而是一个理论相关的问题(我也在使用 Java,但 question/answer 应该是无论语言如何,都一样。)。我想要一个函数,其参数为 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 运动。问题是这只适用于少数线角度,而且大多数情况下只会产生不准确的坐标。比如ratio小于1,y轴每次变化打开x轴都会有0变化,诸如此类的问题。如果有人能给我一个公式或一些帮助,那就太好了。
如果您需要对问题进行任何澄清,请直接提问。提前致谢!
P.S。我知道 drawLine 函数,但我不想简单地绘制
这条线,我想要每个坐标的映射。如果有一个现有的
函数完成我需要它做的事情,然后请告诉我它。
-Ampck
你需要一些算法 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;
}
}
}
}
}
首先,我想说这不是一个语法相关的问题,而是一个理论相关的问题(我也在使用 Java,但 question/answer 应该是无论语言如何,都一样。)。我想要一个函数,其参数为 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 运动。问题是这只适用于少数线角度,而且大多数情况下只会产生不准确的坐标。比如ratio小于1,y轴每次变化打开x轴都会有0变化,诸如此类的问题。如果有人能给我一个公式或一些帮助,那就太好了。
如果您需要对问题进行任何澄清,请直接提问。提前致谢!
P.S。我知道 drawLine 函数,但我不想简单地绘制 这条线,我想要每个坐标的映射。如果有一个现有的 函数完成我需要它做的事情,然后请告诉我它。
-Ampck
你需要一些算法 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;
}
}
}
}
}