最近老师布置一道作业,用DDA算法画出直线,本人在此基础上实现了生成客户区内容为BMP文件的类。
其中一些细节问题值得注意,所以贴出来分享~~
DDA
算法实现画直线
中山大学 叶新州
一.
实验内容
用DDA算法思想画出一条线段.
本程序开发于VC.Net平台,基于MFC框架,实现了根据起始坐标(有平面坐标)来画出线段、并且能保存客户区图片位未压缩BMP文件.
二.
算法思想
本程序的DDA与常见的DDA算法有些不同:
采用X方向逐1递增,然后判断上个点的y坐标(OldY)和当前点的y坐标之差是否大于1,是则链接在中间链接两点(此时两点之间所有点x坐标相等)。
三.
算法核心代码
void
CDrawLineView::DrawLineByDDA(int nStartX, int nStartY, int nEndX, int nEndY)
{
int i;
//定义坐标系转换
CRect crect;
GetClientRect(crect);
m_nOriginY=crect.Height()-50;
m_nOriginX=50;
DrawCoordinate(m_nOriginX,m_nOriginY); //画出直角坐标系
CClientDC dc(this);
nStartX=m_nOriginX+nStartX;
nEndX=m_nOriginX+nEndX;
nStartY=m_nOriginY-nStartY;
nEndY=m_nOriginY-nEndY;
//end of 定义坐标系转换
if (nStartX==nEndX) //若为垂直线
{
if (nStartY>nEndY) //为了保证nStartY小于nEndY
{
int t;
t=nStartY;
nStartY=nEndY;
nEndY=t;
}
for (i=nStartY;i<=nEndY;i++)
{
dc.SetPixel(nStartX,i,m_cLineColor);
}
}
else //不为垂直线
{
int x;
int nBeginX,nStopX,nBeginY,nStopY;
nBeginX=nStartX;
nStopX=nEndX;
nBeginY=nStartY;
nStopY=nEndY;
if (nStartX>nEndX)