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