Я искал в Интернете и нашел сотни вариантов реализации алгоритма рисования линии Брешенема. Но одна вещь, которую я нашел странной, состоит только в двух или трех из них, которые могут охватывать все восемь октетов. Тем не менее, они используются во многих приложениях., пожалуйста, объясните этот чертежный код линии Bresenham для меня
0 Например: this ladythis version (line 415) алгоритм Брешенема. Но он не охватывает все 360 градусов. This guy here, похоже, разрабатывает библиотеку. Но все равно это не работает должным образом.
Можете ли вы сказать мне, почему?
This guy's implementation работает нормально. Но, я полагаю, это не Алгоритм Брешенема. У него очень мало сходства с the theory.
И наконец, я нашел the following version алгоритма рисования линии Брешенема, который работает правильно.
#include "utils.h"
void Bresenham(int x1, int y1, int const x2, int const y2, int color)
{
int dx = x2 - x1;
// if x1 == x2, then it does not matter what we set here
int ix((dx > 0) - (dx < 0));
dx = abs(dx) << 1;
int dy = y2 - y1;
// if y1 == y2, then it does not matter what we set here
int iy((dy > 0) - (dy < 0));
dy = abs(dy) << 1;
PlotPixel(x1, y1, color);
if (dx >= dy)
{
// error may go below zero
int error(dy - (dx >> 1));
while (x1 != x2)
{
if ((error >= 0) && (error || (ix > 0)))
{
error -= dx;
y1 += iy;
}
// else do nothing
error += dy;
x1 += ix;
PlotPixel(x1, y1, color);
}
}
else
{
// error may go below zero
int error(dx - (dy >> 1));
while (y1 != y2)
{
if ((error >= 0) && (error || (iy > 0)))
{
error -= dy;
x1 += ix;
}
// else do nothing
error += dx;
y1 += iy;
PlotPixel(x1, y1, color);
}
}
}
int main()
{
int gm = DETECT;
int gd = DETECT;
initgraph(&gm, &gd, "");
double x1 = 0;
double y1 = 0;
double r = 50;
double x2 = 0;
double y2 = 0;
double signx = 0;
double signy = 0;
for(int theta=0 ; theta<=360 ; theta++)
{
x2 = r * cos(DegreeToRad((double) theta));
y2 = r * sin(DegreeToRad((double) theta));
x1 = 5 * cos(DegreeToRad((double) theta));
y1 = 5 * sin(DegreeToRad((double) theta));
Bresenham(x1, y1, x2, y2, YELLOW);
//delay(10);
}
getch();
closegraph();
return 0;
}
Оригинальный код довольно странный. Поэтому мне нужна ваша помощь, чтобы понять это.
Почему он оставил смещение dx и dy, а затем, прежде чем вычислять, снова переместил их вправо?
Где dt и ds, о которых говорят the theory?
Согласно теории, dt и ds должны быть проверены на каждом этапе цикла while. Но этот код не делает этого. Зачем?
Теория, по-видимому, не имеет указаний на обработку ошибок. Каково использование
error
, которое вычисляет код? Как он вычисляетerror
? Как он использует значениеerror
?Какова логика теста
if(dx >= dy)
?
"мы нарисуем D + 1 точки, соответствующие дробному t: (X + I.Dx/D, Y + I.Dy/D), с I в [0, D]." --- Как вы это вывели? – anonymous
I/D идет от 0 до 1 с шагом 1/D, что соответствует приращениям Dx/D на X и Dy/D на Y, один из которых равен 1. –
Но как что? –