コンピュータグラフィックの線(DDA、Bresenham、中点線)は各種の傾きに対して

2731 ワード

どうしてこの文章を書きますか.
ブロガーも最初はあちこちで多くのコードを参考にして研究していましたが、任意の傾きを考えると、if文で別々に議論されているコードが多いことに気づきました.実は重複するコードの部分がたくさんあります.コードが簡潔ではないと思います.あちこちで参考にして考えてから、比較的簡潔なコードをまとめました.皆さんが好きで、もっと良い方法で共有することを期待しています.
その中のコードはJavaScriptで書きましたが、その原理は通じていて、基本的に文法を変えても使えます.
本文に入ります.
  • 数値微分法DDA:xの傾きを見て増加の方向を決定し、DrawPixel(x,y,color)は画点個人関数である.
  •  function DDA(x0, y0, x1, y1, color) {
          var dx, dy, m, k;
          var incX, incY, x, y;
          dx = x1 - x0; dy = y1 - y0;
          //     :  ?    true m=Math.abs(dx) ,  m=Math.abs(dy)
          m = (Math.abs(dx) > Math.abs(dy)) ? Math.abs(dx) : Math.abs(dy);//Math.abs    
    
          incX = dx / m;
          incY = dy / m;
          x = x0; y = y0;
          for (k = 1; k < m; k++) {
              x += incX;
              y += incY;
              DrawPixel(Math.floor(x + 0.5), Math.floor(y + 0.5), color);//Math.floor    
          }
    }
  • Bresenham線引きアルゴリズム:dxで毎回増加するか減少するかを決定し、このようにk<0の場合を考慮し、|k|>1の場合、2点のXY座標を交換して描画を行い、描画点の関数を呼び出す場合、XY座標を同時に置き換えることを覚えておく必要があります.
  • function Bresenham(x0, y0, x1, y1, color) {
       var x, y, dx, dy, e, m;
       dx = x1 - x0; dy = y1 - y0;
       var flag = Math.abs(dx) - Math.abs(dy);//        1
       if (flag < 0) {//    1   XY  
           m = y0; y0 = x0; x0 = m;
           m = y1; y1 = x1; x1 = m;
       }
    
       dx = x1 - x0; dy = y1 - y0;
       e = 2 * Math.abs(dy) - Math.abs(dx);
       x = x0; y = y0;
       incX = (dx > 0) ? 1 : -1; //      ,  <0   
       incY = dy / Math.abs(dy);//          
    
       for (var i = 0; i < (Math.abs(dx)-1) ; i++) {
           x += incX;
           if (e < 0)
               e += 2 * Math.abs(dy);
           else {
               y += incY;
               e = e + 2 * (Math.abs(dy) - Math.abs(dx));
           }
    
           if (flag < 0)//    1   XY  
               DrawPixel(y, x, color);
           else
              DrawPixel(x, y, color);
        }
    }
  • 中点画線法:考え方はほぼBresenhamアルゴリズム
  • と同じである.
     function MiddlePiont(x0, y0, x1, y1, color) {
        var dx, dy, d1, d2, d, x, y, m;
        dy = y0 - y1; dx = x1 - x0;
        var flag = Math.abs(dx) - Math.abs(dy);//        1
        if (flag < 0) {//    1   XY  
            m = y0; y0 = x0; x0 = m;
            m = y1; y1 = x1; x1 = m;
        }
    
        dy = y0 - y1; dx = x1 - x0;
        d = 2 * dy + Math.abs(dx);
        d1 = 2 * dy; d2 = 2 * (Math.abs(dx) + dy);
        x = x0; y = y0;
        var incX = (dx > 0) ? 1 : -1;//      ,  <0   
        var incY = (dy > 0) ? -1 : 1;
                 
        for (var i = 0; i < Math.abs(dx) ; i++) {
             x += incX;
             if (d < 0) { 
                 y += incY; d += d2; }
             else
                 d += d1;
    
             if (flag < 0)//    1   XY  
                 DrawPixel(y, x, color);
             else
                 DrawPixel(x, y, color);
         }}