直线DDA和圆的bres算法
void DDA(int xa, int ya, int xb, int yb, void (*setPixel)(int x, int y)) {
float Dx, Dy, x, y;
int dx, dy, steps;
dx = xb - xa;
dy = yb - ya;
if (abs(dx) > abs(dy)) {
steps = abs(dx);
}
else {
steps = abs(dy);
}
Dx = (float)dx / (float)steps;
Dy = (float)dy / (float)steps;
x = xa;
y = ya;
setPixel(x, y);
for (int k = 0;k < steps;k++) {
x += Dx;
y += Dy;
setPixel(x, y);
}
}
float dist(int x1, int y1, int x2, int y2) {
int xc = x1 - x2;
int yc = y1 - y2;
xc = xc * xc + yc * yc;
return sqrt(xc);
}
void draw8P(int xa, int ya, int x, int y, void (*setPixel)(int x, int y)){
setPixel(xa + x, ya + y);
setPixel(xa - x, ya + y);
setPixel(xa + x, ya - y);
setPixel(xa - x, ya - y);
setPixel(xa + y, ya + x);
setPixel(xa - y, ya + x);
setPixel(xa + y, ya - x);
setPixel(xa - y, ya - x);
return;
}
void Bres(int xa, int ya, int R, void (*setPixel)(int x, int y)) {
int x = 0, y = R, p = 3 - 2*R;
while (x < y) {
draw8P(xa, ya, x, y, setPixel);
if (p < 0) {
p = p + 4 * x + 6;
}
else {
p = p + 4 * (x - y) + 10;
y -= 1;
}
x += 1;
}
if (x == y) {
draw8P(xa, ya, x, y, setPixel);
}
}