posts - 28,  comments - 6,  trackbacks - 0

通过DDA 算法的伪代码再加上自己的理解实现的VC小程序
呵呵```很简单``````初学```积累```
伪代码:

procedure DDA( x1, y1, x2, y2: integer);
var
  dx, dy, steps: integer;
  x_inc, y_inc, x, y: real;
begin
  dx :
=  x2  -  x1; dy : =  y2  -  y1;
  
if  abs(dx)  >  abs(dy) then
     steps :
=  abs(dx);  {steps  is  larger of dx, dy}
  
else
     steps :
=  abs(dy);
  x_inc :
=  dx / steps; y_inc : =  dy / steps;
  
{either x_inc or y_inc  =   1.0 , the other  is  the slope}
  x:
= x1; y: = y1;
  set_pixel(round(x), round(y));
  
for  i : =   1  to steps  do
    begin
      x :
=  x  +  x_inc;
      y :
=  y  +  y_inc;
      set_pixel(round(x), round(y));
    end;
end; 
{DDA}

下面是简单的实现```能画任意两点只间的线段:

void  CLineView::DDA(CPoint point_start, CPoint point_end)
{    MessageBox( " DDA Line Start! " );


    CDC 
*  pDC  =  GetDC();
    
int  color  =  RGB( 128 , 128 , 0 );
    
float  step_x , step_y;
    
float  dx , dy , k;
    dx 
=  ( float )(point_end.x  -  point_start.x);
    dy 
=  ( float )(point_end.y  -  point_start.y);
    k 
=  dy / dx;
    step_x 
=  ( float )point_start.x;
    step_y 
=  ( float )point_start.y;
    

    
    
if (point_start.x  ==  point_end.x)
    
{    
        
// 平行Y轴的线
        
// 确定渐进方向
         if (point_start.y < point_end.y)
        
{
            
for (( int )(step_y  =  point_start.y);( int )step_y  <=  point_end.y ; step_y ++  )
            pDC
-> SetPixel(( int )step_x,( int )step_y,color);        
        }
else
        
{
            
for (step_y ; step_y  >=  point_end.y ; step_y --  )
            pDC
-> SetPixel(( int )step_x,( int )step_y,color);    
        }


    }
else   if (point_start.y  ==  point_end.y)
    
{     // 平行X轴的线
        
// 确定渐进方向
         if (point_start.x < point_end.x)
        
{
            
for (step_x ; step_x  <=  point_end.x ; step_x ++  )
            pDC
-> SetPixel(( int )step_x,( int )step_y,color);        
        }
else
        
{
            
for (step_x ; step_x  >=  point_end.x ; step_x --  )
            pDC
-> SetPixel(( int )step_x,( int )step_y,color);    
        }

        
    }
else
    
{    // 斜线
         if (abs(k) < 1 )
        
{    
            
if (point_start.x  <  point_end.x)
            
{    
                    
for (step_x  =  ( float )point_start.x;step_x  <=  point_end.x ; step_x ++ )
                    
{
                        pDC
-> SetPixel(( int )step_x, int (step_y + 0.5 ),color);
                        step_y 
+=  k;                        
                    }

            
            }
else
            
{     // 判断斜率符号 确定是增加还是减少
                 if (k > 0 )
                
{
                    
for (step_x  =  ( float )point_start.x ; step_x  >  point_end.x ; step_x -- )
                    
{    
                        pDC
-> SetPixel(( int )step_x,( int )(step_y + 0.5 ),color);
                        step_y 
+=  k;
                    }

                }
else
                
{
                    
for (step_x  =  ( float )point_start.x ; step_x  >  point_end.x ; step_x -- )
                    
{    
                        pDC
-> SetPixel(( int )step_x,( int )(step_y + 0.5 ),color);
                        step_y 
-=  k;
                    }

                }

                
            }

        }
else
        
{
            
if (point_start.y  <  point_end.y )
            
{
                
for (step_y  ; step_y  <  point_end.y ; step_y ++ )
                
{  
                    pDC
-> SetPixel(( int )(step_x  +   0.5 ) , ( int )step_y , color);
                    step_x 
=  step_x + 1 / k;
                
                }

            }
else
            
{     // 判断斜率符号 确定是增加还是减少
                 if (k > 0 )
                
{
                    
for (step_y ; step_y  >  point_end.y ; step_y -- )
                    
{  
                        pDC
-> SetPixel(( int )(step_x  +   0.5 ) , ( int )step_y , color);
                         step_x
+= 1 / k;                            
                    }

                }
else
                
{                
                    
for (step_y ; step_y  >  point_end.y ; step_y -- )
                    
{  
                        pDC
-> SetPixel(( int )(step_x  +   0.5 ) , ( int )step_y , color);
                        step_x
-= 1 / k;
                
                    }

                }

            }

        }

    }


    ReleaseDC(pDC);

    MessageBox(
" DDA Line End! " );
}


这是调用它的响应函数:

void  CLineView::OnMenuitemDDA() 
{    
    CPoint p1(
10 , 50 );
    CPoint p2(
200 , 50 );
    CPoint p3(
200 , 150 );
    CPoint p4(
100 , 200 );
    CPoint p5(
250 , 300 );
    CPoint p6(
300 , 25 );

    DDA(p1,p2);
    DDA(p1,p3);
    DDA(p1,p4);
    DDA(p1,p5);
    DDA(p1,p6);
    DDA(p2,p3);
    DDA(p2,p4);
    DDA(p2,p5);
    DDA(p2,p6);
    DDA(p3,p4);
    DDA(p3,p5);
    DDA(p3,p6);
    DDA(p4,p5);
    DDA(p4,p6);
    DDA(p5,p6);

    MessageBox(
" OK! " );
}


这是运行后的图像:


其实 颜色也可以作为参数传递进去的```不过我没有写```
posted on 2006-11-26 15:34 ornaking 阅读(703) 评论(1)  编辑 收藏 引用 所属分类: Windows编程

标题  
姓名  
主页
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]

相关链接:
网站导航: