19,468
社区成员
发帖
与我相关
我的任务
分享
//
void CDrawLinesView::Line_Bresenham(POINT p1, POINT p2,CDC *pDC)
{
int i;
if(p1.x==p2.x)
{// Vertical
if(p1.y<=p2.y) for(i=p1.y;i<=p2.y;i++) pDC->SetPixel(p1.x,i,m_lPenColor);
else for(i=p2.y;i<=p1.y;i++) pDC->SetPixel(p1.x,i,m_lPenColor);
return;
}
if(p1.y==p2.y)
{// Horizon
if(p1.x<=p2.x) for(i=p1.x;i<=p2.x;i++) pDC->SetPixel(i,p1.y,m_lPenColor);
else for(i=p2.x;i<=p1.x;i++) pDC->SetPixel(i,p1.y,m_lPenColor);
return;
}
// oblique
float m=(p2.y-p1.y)*1.0/(p2.x-p1.x);
float p;
p=2*m-1;
if(m>0 && m<=1)
{
if(p1.x<p2.x)
{
while(p1.x<=p2.x)
{
pDC->SetPixel(p1.x++,p1.y,m_lPenColor);
if(p>=0)
{
p+=2*m-2;
p1.y++;
}
else
{
p+=2*m;
}
}
}
else
{
while(p2.x<=p1.x)
{
pDC->SetPixel(p2.x++,p2.y,m_lPenColor);
if(p>=0)
{
p+=2*m-2;
p2.y++;
}
else
{
p+=2*m;
}
}
}
return;
}
//
p=-2*m-1;
if(m<0 && m>=-1)
{
if(p1.x<p2.x)
{
while(p1.x<=p2.x)
{
pDC->SetPixel(p1.x++,p1.y,m_lPenColor);
if(p>=0)
{
p+=-2*m-2;
p1.y--;
}
else
{
p+=-2*m;
}
}
}
else
{
while(p2.x<=p1.x)
{
pDC->SetPixel(p2.x++,p2.y,m_lPenColor);
if(p>=0)
{
p+=-2*m-2;
p2.y--;
}
else
{
p+=-2*m;
}
}
}
return;
}
//
p=2/m-1;
if(m>1)
{
if(p1.y<p2.y)
{
while(p1.y<=p2.y)
{
pDC->SetPixel(p1.x,p1.y++,m_lPenColor);
if(p>=0)
{
p+=2/m-2;
p1.x++;
}
else
{
p+=2/m;
}
}
}
else
{
while(p2.y<=p1.y)
{
pDC->SetPixel(p2.x,p2.y++,m_lPenColor);
if(p>=0)
{
p+=2/m-2;
p2.x++;
}
else
{
p+=2/m;
}
}
}
return;
}
//
p=-2/m-1;
if(p1.y<p2.y)
{
while(p1.y<=p2.y)
{
pDC->SetPixel(p1.x,p1.y++,m_lPenColor);
if(p>=0)
{
p+=-2/m-2;
p1.x--;
}
else
{
p+=-2/m;
}
}
}
else
{
while(p2.y<=p1.y)
{
pDC->SetPixel(p2.x,p2.y++,m_lPenColor);
if(p>=0)
{
p+=-2/m-2;
p2.x--;
}
else
{
p+=-2/m;
}
}
}
}
2.DDA
void DDAline(int x1, int y1, int x2, int y2, CDC* pDC)
{
int wndWidth=480;
int wndHeight=640;
int steps;
steps=abs(x2-x1) >= abs(y2-y1) ? abs(x2-x1):abs(y2-y1);//步数
afxDump << steps << "\n";// 250
float x,y,dx,dy;
// start point at middle
x=(float)(x1 + wndWidth/2+0.5);
y=(float)(y1 + wndHeight/2+0.5);//起点
//
dx=((float)x2-(float)x1)/steps;
afxDump << dx << " =dx\n";
dy=((float)y2-(float)y1)/steps;//每步增长值
afxDump << dy << " =dy\n";
COLORREF color=RGB(255,0,0);
for(int i=0;i<=steps;i++)
{
pDC->SetPixel((int)x,(int)y,color);
x+=dx;
y+=dy;
}// end for
}// end DDALine
DDAline(0, 0, 250, 70, &dc);