直线扫描转换
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 实验目的
1)掌握直线段的中点Bresenham扫描转换算法;
2)掌握直线绘制类的设计实现;
3)掌握菱形图案的生成方法。
2 实验要求
1)直线绘制通过设计类似MFC的直线绘制类来实现,有类似的MoveTo()函数设置直线段起点,LineTo()函数设置直线段终点并完成绘制,还要有直线段颜色设置函数;
2)直线的绘制采用中点Bresenham扫描转换算法实现,根据直线斜率k的范围区分五种不同的情况处理;
3)调用设计实现的直线绘制类,在视图区绘制菱形线框,并要求各边颜色不同。
3 详细设计
3.1 核心算法及类型设计
使用中点Bresenham扫描算法完成绘制:
CP2::CP2()
{
x=0.0;
y=0.0;
}
CP2::~CP2()
{}
CP2::CP2(double x,double y)
{
this->x=x;
this->y=y;
}
CLine::CLine() //构造函数
{}
CLine::~CLine() //析构函数
{}
void CLine::SetLineColor(COLORREF color)
{
clr=color;
}
void CLine::MoveTo(CP2p0)
{
P0=p0;
}
void CLine::MoveTo(double x,double y)
{
P0.x=x;
P0.y=y;
}
void CLine::LineTo(double x,double y,CDC*pDC)
{
CP2 p;
p.x=x;
p.y=y;
LineTo(p,pDC);
}
void CLine::LineTo(CP2p1,CDC*pDC)
{
P1=p1;
CP2 p, t;
if(fabs(P0.x-P1.x)<1e-6)//绘制垂线
{
if(P0.y>P1.y)
{
t=P0; P0=P1; P1=t;
}
for(p=P0;p.y { pDC->SetPixelV (Round(p.x),Round(p.y),clr); } } else { double k,d; k=(P1.y-P0.y)/(P1.x-P0.x); if(k>1.0) { if(P0.y>P1.y) { t=P0; P0=P1; P1=t; } d=1-0.5*k; for(p=P0;p.y { pDC->SetPixelV(Round(p.x),Round(p.y),clr); if(d>=0) { p.x++; d+=1-k; } else d+=1; } } if(0.0<=k && k<=1.0)//绘制0<=k<=1 { if(P0.x>P1.x) { t=P0; P0=P1; P1=t; } d=0.5-k; for(p=P0; p.x { pDC->SetPixelV(Round(p.x),Round(p.y),clr); if(d<0) { p.y++; d+=1-k; } else d-=k; } } if(k>=-1.0&&k<0.0)//绘制-1<=k<0 { if(P0.x>P1.x) { t=P0; P0=P1;P1=t; } d=-0.5-k; for(p=P0; p.x { pDC->SetPixelV(Round(p.x),Round(p.y),clr); if(d>0) { p.y--; d-=1+k; } else d-=k; } } if(k<-1.0)//绘制k<-1 { if(P0.y { t=P0;P0=P1;P1=t; } d=-1-0.5*k; for(p=P0;p.y>P1.y;p.y--) { pDC->SetPixelV(Round(p.x),Round(p.y),clr); if(d<0) { p.x++; d-=1+k; } else d-=1; } } } P0=p1; } 调用直线类绘制菱形线框图: void CLineView::OnDraw(CDC* pDC) { CLineDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; //设置坐标系 CRect rect; GetClientRect(&rect); pDC->SetMapMode(MM_ANISOTROPIC); pDC->SetWindowExt(rect.Width(),rect.Height()); pDC->SetViewportExt(rect.Width(),-rect.Height()); pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2); rect.OffsetRect(-rect.Width()/2,-rect.Height()/2); CLine*line= new CLine; //绘制坐标轴 line->SetLineColor(RGB(0,0,0));//黑色 line->MoveTo(CP2(-rect.Width()/2,0));//x轴 line->LineTo(CP2(rect.Width()/2,0),pDC); line->MoveTo(CP2(0,-rect.Height()/2));//y轴