Это домашнее задание. Мне даны координаты моего окна просмотра и координаты линии, которая задана как горизонтальной, вертикальной, так и 45 градусов.Построение линии с уклоном 45 градусов
Это моя функция, чтобы нарисовать линию
void DrawLine(int p, int x1, int y1, int x2, int y2)
{
int row,col;
if(x1 == x2) //vertical
{
ClipToPanel(panel_top[p][0], panel_top[p][1], panel_bot[p][0], panel_bot[p][1], x1, y1, x2, y2);
// cout<<tmpx1<<","<<tmpy1<<" "<<tmpx2<<","<<tmpy2<<endl;
if(tmpx1==NINF)
return;
if(tmpy1 > tmpy2)
swap(tmpy1,tmpy2);
col = tmpx1 - panel_top[p][0];
for(int i = tmpy1 - panel_top[p][1] ; i <= tmpy2 - panel_top[p][1] ; i++)
panel[p][i][col] = 'x';
}
else if(y1 == y2) //horizontal
{
ClipToPanel(panel_top[p][0], panel_top[p][1], panel_bot[p][0], panel_bot[p][1], x1, y1, x2, y2);
// cout<<tmpx1<<","<<tmpy1<<" "<<tmpx2<<","<<tmpy2<<endl;
if(tmpx1==NINF)
return;
if(tmpx1 > tmpx2)
swap(tmpx1, tmpx2);
row = tmpy2 - panel_top[p][1];
for(int j = tmpx1 - panel_top[p][0] ; j <= tmpx2 - panel_top[p][0] ; j++)
panel[p][row][j] = 'x';
}
else if(abs(x2-x1) == abs(y2-y1)) //45degree line
{
ClipToPanel(panel_top[p][0], panel_top[p][1], panel_bot[p][0], panel_bot[p][1], x1, y1, x2, y2);
// cout<<tmpx1<<","<<tmpy1<<" "<<tmpx2<<","<<tmpy2<<endl;
if(tmpx1 == NINF)
return;
x1 = tmpx1 - panel_top[p][0];
x2 = tmpx2 - panel_top[p][0];
y1 = tmpy1 - panel_top[p][1];
y2 = tmpy2 - panel_top[p][1];
if(y2 > y1)
{
if(x2 > x1)
{
for(int i = y1, j = x1 ; i<=y2 ;i++,j++)
panel[p][i][j] = 'x';
}
else
{
for(int i = y1, j = x1 ; i <= y2; j--, i++)
panel[p][i][j] = 'x';
}
}
else
{
if(x2>x1)
{
for(int i = y1, j = x1 ; i >= y2 ; i--, j++)
panel[p][i][j] = 'x';
}
else
{
for(int i = y1, j = x1 ; i >= y2 ; i--, j--)
panel[p][i][j] = 'x';
}
}
}
}
Оси + Y вниз + X в направлении вправо.
Координаты видового экрана и линии могут варьироваться от -10000 до 10000. Я вычитаю нижний угол, чтобы получить их в диапазоне [0, n] и сохранить в матрице.
ClipToPanel()
- это реализация алгоритма cohen-sutherland для клипа линии и получения конечных точек внутри области просмотра.
Он устанавливает значения, если tmpx1
, tmpy1
, tmpx2
, tmpy2
в качестве конечных точек обрезанной линии.
panel_top[p][0] is upper x-coordinate of viewport (xmin)
panel_top[p][1] is upper y-coordinate of viewport (ymin)
panel_bot[p][0] is lower x-coordinate of viewport (xmax)
panel_bot[p][1] is lower y-coordinate of viewport (ymax)
Если линия не в видовом я координатах набора tmpx1
, tmpx2
, tmpy2
, tmpy1
к NINF
.
Я не могу найти ошибку. Мой онлайн-судья продолжает давать мне неправильный ответ.
У вас есть вход, который дает неправильный вывод? Вы уверены, что 'ClipToPanel' верен? – Jarod42
Вы уверены, что используете формат 'panel [p] [y] [x]' (кажется, используется когерентность) – Jarod42
Хорошая отправная точка: http://math.stackexchange.com – 4386427