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