2015-12-30 5 views
-1

Это домашнее задание. Мне даны координаты моего окна просмотра и координаты линии, которая задана как горизонтальной, вертикальной, так и 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.

Я не могу найти ошибку. Мой онлайн-судья продолжает давать мне неправильный ответ.

+0

У вас есть вход, который дает неправильный вывод? Вы уверены, что 'ClipToPanel' верен? – Jarod42

+0

Вы уверены, что используете формат 'panel [p] [y] [x]' (кажется, используется когерентность) – Jarod42

+0

Хорошая отправная точка: http://math.stackexchange.com – 4386427

ответ

0

Это будет комментарий, но поскольку он содержит некоторый код, я отправлю его в качестве ответа. Я думаю, что вы можете рассмотреть вопрос о том, упрощающей функции диагоналей выхода, учитывая, что есть в основном только два из них:

if (x1 > x2) swap(x1,x2); 
if (y2 > y1) { 
    for(int i = y1, j = x1; j <= x2; i++, j++) 
     panel[p][i][j] = 'x'; 
} else { 
    for(int i = y2, j = x1; j <= x2; i++, j--) 
     panel[p][i][j] = 'x'; 
} 

Это может быть полезно знать, какие ценности вы получаете для вашего переменных.

Смежные вопросы