看了一个讲该算法生成过程的视频:
https://www.youtube.com/watch?v=RGB-wlatStc
自己算了半天各种情况,结果整合出来还剩45度显示不出来,舍不得删掉留一个存档。
public void bresehamLine(int x1, int y1, int x2, int y2, int r, int g, int b, int a) {
int p,x,y;
int dx = Math.abs(x2-x1); // dx
int dy = Math.abs(y2-y1) ; // dy
int twoDy = 2*dy; // 2dy
int twoDx = 2*dx;
int twoDyMinusDx = 2*(dy - dx); // 2dy-2dx
int twoDyAddDx = 2*(dy + dx);
p = 2*dy - dx;
x = x1;
y = y1;
if((x1>x2)) {
//draw from (x2,y2)
x = x2; x2 = x1; y = y2; y2 = y1;
}
p = 2*dy - dx;
if(dx>dy) {
// degree <45
while(x <= x2) {
// draw current point
point(x, y, r, g, b, a);
//Calculate next point
x++;
if(p<0) {
p += twoDy;
}else {
p = p + twoDyMinusDx;
if(y1<=y2) {
//dy/dx >= 0
y++;
}else {
//y1>y2,dy/dx < 0
y--;
}
}
}
}else {
//degree >= 45
while(Math.abs(y-y2) != 0) {
// draw current point
point(x, y, r, g, b, a);
//Calculate next point
if(y<=y2) {
//dy/dx > 0
y++;
}else {
//dy/dx <= 0
y--;
}
if(p<0) {
p = p + twoDyMinusDx;
x++;
}else {
p = p - twoDx;
}
}
}
}
经过一阵子的strugglling,莫名其妙的他就好了,引入了两个变量保存线段终点。其他地方哪里不同,我是看不出来了。
public void bresehamLine(int x1, int y1, int x2, int y2, int r, int g, int b, int a) {
int dx = Math.abs(x2-x1); // dx
int dy = Math.abs(y2-y1) ; // dy
int twoDy = 2*dy; // 2dy
int twoDx = 2*dx;
int twoDyMinusDx = 2*(dy - dx); // 2dy-2dx
int twoDyAddDx = 2*(dy + dx);
int p = 2*dy - dx;
int x = x1;
int y = y1;
int xEnd = x2;
int yEnd = y2;
if((x1>x2)) {
//draw from (x2,y2)
x = x2; xEnd = x1; y = y2; yEnd = y1;
}
if(dx>dy) {
// dx>dy, 0<k<1, so that 0< degree <45,
while(x <= xEnd) {
// draw current point
point(x, y, r, g, b, a);
//Calculate next point
x++;
if(p<0) {
p += twoDy;
}else {
p = p + twoDyMinusDx;
if(y<=yEnd) {
//
y++;
}else {
//y1>y2,
y--;
}
}
}
}else {
//dx<dy, k>1, so that degree >= 45
while(Math.abs(y-yEnd) != 0) {
// draw current point
point(x, y, r, g, b, a);
//Calculate next point
if(y<=yEnd) {
//dy/dx > 0
y++;
}else {
//dy/dx <= 0
y--;
}
if(p<0) {
p = p + twoDyMinusDx;
x++;
}else {
p = p - twoDx;
}
}
}
}