直线扫描转换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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轴

相关文档
最新文档