C++ 绘制坡度为45度的直线

C++ 绘制坡度为45度的直线,c++,geometry,C++,Geometry,这是一个家庭作业。我得到了视口的坐标,以及水平、垂直或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); //

这是一个家庭作业。我得到了视口的坐标,以及水平、垂直或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';
        }
    }
}
}
如果该行不在视口坐标中,我将
tmpx1
tmpx2
tmpy2
tmpy1
设置为
NINF


我似乎找不到错误。我的在线法官一直给我一个错误的答案。

这可能是一个评论,但因为它包含一些代码,我将把它作为答案发布。我认为你可以考虑简化对角线输出函数的事实,考虑到基本上只有两个:

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';
}
if(x1>x2)交换(x1,x2);
如果(y2>y1){

对于(int i=y1,j=x1;j)您是否有给出错误输出的输入?您是否确定
cliptoppanel
正确?您是否确定
panel[p][y][x]
的格式(似乎使用了一致性)一个很好的起点:@Jarod42是的,我有其他功能,比如drawRectangle、drawPolygon,它们使用drawline执行操作,并且通过了测试。只有drawline测试失败。我确定panel[p][y][x]格式。p是面板的索引(可以有多个面板)。y是行(因为+y轴向下),x是列(+X轴向右)
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';
}