直线生成算法

void  CDrawLinesView::MenuDdaline()
{
    CDC
* pDC = GetDC();

    
int xa = m_pnt1.x, ya = m_pnt1.y, xb = m_pnt2.x, yb = m_pnt2.y, c = RGB(255,0,0);

    
float x,y;
    
float dx, dy, k;
    dx 
= (float)(xb - xa);
    dy 
= (float)(yb - ya);
    k 
= dy / dx;
    y 
= ya;
    x 
= xa;
    
if(abs(k)<1)
    
{
        
if(xa <= xb){
            
for(x = xa; x <= xb; ++x)
            
{
                pDC
->SetPixel((int)x,int(y+0.5),c);
                y 
+= k;
            }

        }

        
else if(xa > xb)
        
{
            
for(x = xa; x >= xb; --x)
            
{
                pDC
->SetPixel((int)x,int(y+0.5),c);
                y 
-= k;
            }
            
        }

    }

    
if(abs(k)>=1)
    
{
        
if(ya <= yb){
            
for(y = ya; y <= yb; ++y)
            
{
                pDC
->SetPixel(int(x+0.5),(int)y, c);
                x 
+=  1/k;
            }

        }

        
else if( ya > yb)
        
{
            
for(y = ya; y >= yb; --y)
            
{
                pDC
->SetPixel(int(x+0.5),(int)y, c);
                x 
-=  1/k;
            }
        
        }

    }

    ReleaseDC(pDC);
}



void  CDrawLinesView::MenuMindlepoint()
{
    CDC
* dc = GetDC();

    
int x0 = m_pnt1.x, y0 = m_pnt1.y, x1 = m_pnt2.x, y1= m_pnt2.y, color = RGB(0,255,0);

    
int dx,dy,nexte,nextne,d,x,t,y;
    
float m;
    dx
=x1-x0;
    dy
=y1-y0;
    m
=1.0*dy/dx;   //¼ÆËãбÂÊ£¬²¢ÒÀ¾Ý´Ë½øÐÐÅжÏ
    if(m<=1&&m>=0)
    
{
        
if(x0>=x1)
        
{
            swap(x0,x1);
            swap(y0,y1);
            dx
=-dx;dy=-dy;      //½»»»×ø±êºódx,dy±äΪÏà·´µÄÊý
        }

        x
=x0;   y=y0;
        d
=dx-2*dy;     //d0
        nexte=-2*dy;         //ÏÂÒ»¸ö×ø±ê¾àÀëÇ°Ò»¸ö×ø±êµÄÆ«ÒÆ
        nextne=-2*dy+2*dx;
        
while(x<x1)
        

            
if(d>0)
                d
+=nexte;
            
else
            
{
                d
+=nextne;
                y
++;
            }

            x
++;
            dc
->SetPixel(x,y,color);
        }

    }
 
    
else if(m>=-1&&m<0)
    
{
        
if(x0>=x1)
        
{
            swap(x0,x1);
            swap(y0,y1);
            dx
=-dx;dy=-dy;
        }

        x
=x0;y=y0;
        d
=-dx-2*dy;   //d0
        nexte=-2*dy;
        nextne
=-2*dy-2*dx;
        
while(x<x1)
        
{
            
if(d>0)
            
{
                d
+=nextne;
                y
--;
            }

            
else
                d
+=nexte;
            x
++;
            dc
->SetPixel(x,y,color);
        }

    }
   
    
else if(m>1)
    
{  
        
if(y0>=y1)
        
{
            swap(x0,x1);
            swap(y0,y1);
            dy
=-dy;dx=-dx;
        }

        x
=x0;
        y
=y0;
        d
=-dy+2*dx;     //d0
        nexte=2*dx;
        nextne
=-2*dy+2*dx;
        
while(y<y1)
        
{
            
if(d>0)
            
{
                d
+=nextne;
                x
++;
            }

            
else
                d
+=nexte;
            y
++;
            dc
->SetPixel(x,y,color);
        }
  
    }

    
else if(m<-1)
    
{
        
if(y0>=y1)
        
{
            swap(x0,x1);
            swap(y0,y1);
            dx
=-dx;dy=-dy;
        }

        x
=x0;
        y
=y0;
        d
=2*dx+dy;   //d0
        nexte=2*dx;
        nextne
=2*dx+2*dy;
        
while(y<y1)
        
{
            
if(d<0)
            
{
                d
+=nextne;
                x
--;
            }

            
else
                d
+=nexte;
            y
++;
            dc
->SetPixel(x,y,color);
        }
 
    }
    
    ReleaseDC(dc);
}

void  swap( int &  x1,  int &  x2)
{
    
int t;
    t 
= x1;
    x1 
= x2;
    x2 
= t;
}

void  CDrawLinesView::MenuBhline()
{
    CDC
* dc = GetDC();

    
int x0 = m_pnt1.x, y0 = m_pnt1.y, x1 = m_pnt2.x, y1= m_pnt2.y, color = RGB(0,0,255);

    
int x,y,dx,dy,sx,sy;
    
int f;
    
bool flag = false;
    x 
= x0;
    y 
= y0;
    dx 
= abs(x0-x1);
    dy 
= abs(y0-y1);
    
if(x1-x0 >= 0)
        sx 
= 1;
    
else
        sx 
= -1;
    
if(y1-y0>=0)
        sy 
= 1;
    
else
        sy 
= -1;
    
if(dy > dx)
    
{
        swap(dx,dy);
        flag 
= true;
    }

    
else
        flag 
= false;
    
    f 
= 2*dy - dx;
    
    
for(int i=1; i<=dx; ++i)
    
{
        dc
->SetPixel(x,y,color);
        
if(f >= 0)
        
{
            
if(flag)
                x 
+= sx;
            
else
                y
+=sy;
            dc
->SetPixel(x,y,color);
            f 
-= 2*dx;
        }

        
else
        
{
            
if(flag)
                y
+=sy;
            
else
                x
+=sx;
            f 
+= 2*dy;
        }

    }

}

void  CDrawLinesView::OnMenuDdaline() 
{
    
// TODO: Add your command handler code here
    m_blDDA = true;
    m_blMid 
= false;
    m_blBre 
= false;
}


void  CDrawLinesView::OnMenuMindlepoint() 
{
    
// TODO: Add your command handler code here
    m_blDDA = false;
    m_blMid 
= true;
    m_blBre 
= false;    
}


void  CDrawLinesView::OnMenuBhline() 
{
    
// TODO: Add your command handler code here
    m_blDDA = false;
    m_blMid 
= false;
    m_blBre 
= true;    
}


void  CDrawLinesView::OnLButtonDown(UINT nFlags, CPoint point) 
{
    
// TODO: Add your message handler code here and/or call default

    
++m_pntCount;
    
if(m_pntCount == 1)
        m_pnt1 
= point;
    
else if(m_pntCount == 2)
    
{
        m_pnt2 
= point;
        
if(m_blDDA)
            MenuDdaline();
        
if(m_blMid)
            MenuMindlepoint();
        
if(m_blBre)
            MenuBhline();
        m_pntCount 
= 0;
    }


    CView::OnLButtonDown(nFlags, point);
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值