Моя домашняя работа по компьютерной графике заключается в реализации алгоритмов OpenGL с использованием только способности нарисовать точки.Чертежные линии с линейным алгоритмом Брешенема
Так что, очевидно, мне нужно получить drawLine()
, прежде чем я смогу нарисовать что-нибудь еще. drawLine()
должен выполняться только с использованием целых чисел. Нет плавающей запятой.
Это то, чему меня учили. В принципе, линии могут быть разбиты на 4 разные категории, положительные крутые, положительные мелкие, отрицательные крутые и отрицательные мелкие. Это изображение я должен рисовать:
и это картина моей программы рисования:
Цвет сделал для нас. Нам даны вершины, и нам нужно использовать алгоритм линии Брешенема для рисования линий на основе начальной и конечной точек.
Это то, что я до сих пор:
int dx = end.x - start.x;
int dy = end.y - start.y;
//initialize varibales
int d;
int dL;
int dU;
if (dy > 0){
if (dy > dx){
//+steep
d = dy - 2*dx;
dL = -2*dx;
dU = 2*dy - 2*dx;
for (int x = start.x, y = start.y; y <= end.y; y++){
Vertex v(x,y);
drawPoint(v);
if (d >= 1){
d += dL;
}else{
x++;
d += dU;
}
}
} else {
//+shallow
d = 2*dy - dx;
dL = 2*dy;
dU = 2*dy - 2*dx;
for (int x = start.x, y = start.y; x <= end.x; x++) {
Vertex v(x,y);
drawPoint(v);
// if choosing L, next y will stay the same, we only need
// to update d by dL
if (d <= 0) {
d += dL;
// otherwise choose U, y moves up 1
} else {
y++;
d += dU;
}
}
}
} else {
if (-dy > dx){
cout << "-steep\n";
//-steep
d = dy - 2*dx;
//south
dL = 2*dx;
//southeast
dU = 2*dy - 2*dx;
for (int x = start.x, y = start.y; y >= end.y; --y){
Vertex v(x,y);
drawPoint(v);
//if choosing L, next x will stay the same, we only need
//to update d
if (d >= 1){
d -= dL;
} else {
x++;
d -= dU;
}
}
} else {
cout << "-shallow\n";
//-shallow
d = 2*dy - dx;
dL = 2*dy;
dU = 2*dy - 2*dx;
for (int x = start.x, y = start.y; x <= end.x; x++){
Vertex v(x,y);
drawPoint(v);
if (d >= 0){
d += dL;
} else {
--y;
d -= dU;
}
}
}
}
Я знаю, что моя ошибка будет что-то глупо, но я честно не могу понять, что я делаю неправильно. Почему некоторые из строк рисуются неправильно, как показано выше?
что не работает? –
Если вы посмотрите на два изображения в параграфе выше моего кода, «2-й квадрант» и «четвертый квадрант» не будут правильно рисовать. Я помещаю их в кавычки, потому что точка (0,0) находится в нижнем левом углу изображения. В основном, первый оператор else содержит код, который работает некорректно, -shallow и -steep. – ToastyMallows
запустите свой код на 2 простых примерах, один из которых работает, а тот, который этого не делает. Скажите (0,0), (5, 5) и (0,5), (5,0), проследите через оба и увидите, они расходятся. Это будет намного лучше, чем делать кого-то, кто сделает это за вас. –