计算机图形学中点画线法

中点画线法

在DDA算法中已经将乘法运算改进到了加法运算,但加法运算的时候进行的都是浮点类型的运算,运算结束后还要进行取证处理。中点画线算法就是将浮点类型的运算改进成为整数的运算。该算法采用的是直线的一般式方程。还是以一种特殊情况为例,0<k<1每次在x方向上移动1个像素,y方向上移动一个或者不移动。所以可以通过判断下一个点与y+1和y的距离大小来决定y是否加1。可以通过判断下一个点的终点坐标也就是(x+1,y+0.5)到底是在直线的上方还是下方。该直线将平面分为三部分直线上方,在直线上,在直线下方。也就是将坐标(x+1,y+0.5)带入直线的一般式方程,若方程值小于0,即中点在直线下方,y取y+1;若方程值大于0,即中点在直线上方,y不变。就是判断A(x+1)+B(y+0.5)+C的大小。设这个距离为d因为Ax+By+C=0,即d的初始值为A+0.5B。为了把它变成整数加法可以给他扩大2倍。2d=2A+B。d<0时2d=2d+2A+2B;d>0时,2d=2d+2A这样中点画线算法就将算法优化到了整数的加法。下面是我所写的中点画线算法,还不够精炼,,后续有时间会进行改进
计算机图形学几个比较经典的算法我已经发到了https://download.csdn.net/download/gygygyyyyyy/12550827
如果有需要的话可以下载哦

  //中点画线函数
            double x = x1, y = y1;
            double d, A, B, i, deta1, deta2;
            A = y1 - y2; B = x2 - x1;
            if (Math.Abs(x1 - x2) > Math.Abs(y1 - y2))//斜率小于1
            {
                if (y1 - y2 < 0)
                {
                   if (x2 - x1 < 0)          //第二象限k<1
                    {
                        d = B - 2 * A;
                        deta1 = - 2 * A;
                        deta2 = 2 * ((-1) * A + B);
                        for (i = 1; i < Math.Abs(x1 - x2); i++)
                        {
                            if (d < 0)
                            {
                                d = d + deta1; 
                            }
                            else
                            {
                                d = d + deta2;  y++;
                            }
                             x--;
                            mydraw.SetPixel((int)x, (int)y, c);
                        }
                    else			//第一象限k<1    
                    {
                         d = 2 * A + B;
                        deta1 = 2 * A;
                        deta2 = 2 * (A + B);
                        for (i = 1; i < Math.Abs(x1 - x2); i++)
                        {
                            if (d < 0)
                            {
                                d = d + deta2; y = y + 1 ;
                            }
                            else
                            {
                                d = d + deta1;
                            }
                            x = x + 1;
                            mydraw.SetPixel((int)x, (int)y, c);
                        }
                      }
                   }
                   else                                   //第三,四象限k<1
                {
                    if (x1 > x2)                       //第三象限
                    {                    
                        d = - 2 * A - B;
                        deta1 = -2 * A;
                        deta2 = (-2) * (A + B);
                        for (i = 1; i < Math.Abs(x1 - x2); i++)
                        {
                            if (d < 0)
                            {
                                d = d + deta2;y--;
                            }
                            else
                            {
                                d = d + deta1;
                            }
                             x --;
                            mydraw.SetPixel((int)x, (int)y, c);
                        }
                      }
                    else                            //第四象限
                    {
                    d = 2 * A - B;
                        deta1 =  2 * A;
                        deta2 = 2 * (A - B);
                        for(i = 1; i < Math.Abs(x1 - x2); i++)
                       {
                            if (d < 0)
                            {
                                d = d + deta1; 
                            }
                            else
                            {
                                d = d + deta2; y --;
                            }
                             x ++;
                            mydraw.SetPixel((int)x, (int)y, c);
                        }
                      }
                  }
            }
            else                              //k>1
            {
                if (y1 - y2 < 0)               //第一,二象限k>1
                {
                    if (x1 < x2)             //第一象限k>1
                    {
                        
                        d = 2 * B + A;
                        deta1 = 2 * B;
                        deta2 = 2 * (A + B);
                        for (i = 1; i < Math.Abs(y1 - y2); i++)
                        {
                            if (d < 0)
                            {
                                d = d + deta1;
                            }
                            else
                            {
                                d = d + deta2; x ++;
                            }
                             y ++;
                            mydraw.SetPixel((int)x, (int)y, c);
                        }
                    }
                    else                       //第二象限k>1
                    {
                       
                        d = 2 * B - A;
                        deta1 = 2 * B;
                        deta2 = 2 * (-A + B);
                        for (i = 1; i < Math.Abs(y1 - y2); i++)
                       {
                         if (d < 0)
                         {
                            d = d + deta2; x = x - 1;
                         }
                         else
                         {
                            d = d + deta1;
                         }
                         y ++ ;
                        mydraw.SetPixel((int)x, (int)y, c);
                       }
                   }
                 }
                 else                                  //第三,四象限k>1
                {
                    if (x1 > x2)                 //第三象限 k>1
                    {
                        d = -A - 2 * B;
                        deta1 = -2 * B;
                        deta2 = -2 * (B + A);
                        for (i = 1; i < Math.Abs(y1 - y2); i++)
                        {
                            if (d < 0)
                            {
                                d = d + deta1; 
                            }
                            else
                            {
                                d = d + deta2;x --;
                            }
                            y --;
                            mydraw.SetPixel((int)x, (int)y, c);
                        }
                        }
                    else                   //第四象限  k<1
                    {
                        d = A - 2 * B;
                        deta1 = -2 * B;
                        deta2 = 2 * (A - B);
                        for (i = 1; i < Math.Abs(y1 - y2); i++)
                        {
                            if (d < 0)
                            {
                                d = d + deta2; x ++;
                            }
                            else
                            {
                                d = d + deta1;
                            }
                            y --;
                            mydraw.SetPixel((int)x, (int)y, c);
                        }
                      }
                   }
                }
      


           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值