以不同角度绘制像素化线

时间:2017-09-29 22:05:13

标签: algorithm draw

我试图找到一种方法来计算如何在10x29像素图像上制作斜线。

我已经手工绘制了所有可能的位置,但我想知道是否有一种算法可以将其雾化。像绘画这样的程序可以做到这一点显然是可能的,但我不确定即使是谷歌。欢迎任何提示!

 if y=0 then playfield:
        .............................
        .............................
        .............................
        .............................
        .............................
        .............................
        .............................
        .............................
        XXXXXXXXXXXXXXX..............
        .............................
        .............................
end
 if y=2 then playfield:
        .............................
        .............................
        .............................
        .............................
        .............................
        .............................
        .............................
        XXXXXXXX.....................
        ........XXXXXXX..............
        .............................
        .............................
end
 if y=4 then playfield:
        .............................
        .............................
        .............................
        .............................
        .............................
        .............................
        XXXX.........................
        ....XXXXXXX..................
        ...........XXXX..............
        .............................
        .............................
end

 if y=6 then playfield:
        .............................
        .............................
        .............................
        .............................
        .............................
        XXX..........................
        ...XXXXX.....................
        ........XXXX.................
        ............XXX..............
        .............................
        .............................
end
 if y=8 then playfield:
        .............................
        .............................
        .............................
        .............................
        .............................
        XXX..........................
        ...XXXXX.....................
        ........XXXX.................
        ............XXX..............
        .............................
        .............................
end
 if y=10 then playfield:
        .............................
        .............................
        .............................
        .............................
        XX...........................
        ..XXXX.......................
        .....XXXX....................
        .........XXXX................
        .............XX..............
        .............................
        .............................
end
 if y=12 then playfield:
        .............................
        .............................
        .............................
        XX...........................
        ..XXX........................
        .....XXX.....................
        ........XX...................
        ..........XXX................
        .............XX..............
        .............................
        .............................
end
 if y=14 then playfield:
        .............................
        .............................
        XX...........................
        ..XX.........................
        ....XX.......................
        ......XXX....................
        .........XX..................
        ...........XX................
        .............XX..............
        .............................
        .............................
end
 if y=16 then playfield:
        .............................
        XX...........................
        ..XX.........................
        ....XX.......................
        ......XX.....................
        ........XX...................
        ..........XX.................
        ............XX...............
        ..............X..............
        .............................
        .............................
end
 if y=18 then playfield:
        X............................
        .XX..........................
        ...XX........................
        .....XX......................
        .......XX....................
        .........X...................
        ..........XX.................
        ............XX...............
        ..............X..............
        .............................
        .............................
end
 if y=20 then playfield:
        .X...........................
        ..XX.........................
        ....XX.......................
        ......X......................
        .......XX....................
        .........X...................
        ..........XX.................
        ............XX...............
        ..............X..............
        .............................
        .............................
end
 if y=22 then playfield:
        ..X..........................
        ...XX........................
        .....X.......................
        ......XX.....................
        ........X....................
        .........XX..................
        ...........X.................
        ............XX...............
        ..............X..............
        .............................
        .............................
end
 if y=24 then playfield:
        ...X.........................
        ....XX.......................
        ......X......................
        .......X.....................
        ........XX...................
        ..........X..................
        ...........X.................
        ............XX...............
        ..............X..............
        .............................
        .............................
end
 if y=26 then playfield:
        ....X........................
        .....X.......................
        ......XX.....................
        ........X....................
        .........X...................
        ..........X..................
        ...........XX................
        .............X...............
        ..............X..............
        .............................
        .............................
end
 if y=28 then playfield:
        .....X.......................
        ......X......................
        .......X.....................
        ........X....................
        .........XX..................
        ...........X.................
        ............X................
        .............X...............
        ..............X..............
        .............................
        .............................
        .............................
end
 if y=30 then playfield:
        .......X.....................
        ........X....................
        .........X...................
        ..........X..................
        ...........X.................
        ............X................
        .............X...............
        ..............X..............
        .............................
        .............................
end
 if y=32 then playfield:
        .......X.....................
        ........X....................
        .........X...................
        ..........X..................
        ..........X..................
        ...........X.................
        ............X................
        .............X...............
        ..............X..............
        .............................
        .............................
end
 if y=34 then playfield:
        ........X....................
        .........X...................
        .........X...................
        ..........X..................
        ...........X.................
        ............X................
        ............X................
        .............X...............
        ..............X..............
        .............................
        .............................
end
 if y=36 then playfield:
        .........X...................
        ..........X..................
        ..........X..................
        ...........X.................
        ...........X.................
        ............X................
        .............X...............
        .............X...............
        ..............X..............
        .............................
        .............................
end
 if y=38 then playfield:
        ..........X..................
        ..........X..................
        ...........X.................
        ...........X.................
        ............X................
        ............X................
        .............X...............
        .............X...............
        ..............X..............
        .............................
        .............................
end
 if y=40 then playfield:
        ...........X.................
        ...........X.................
        ............X................
        ............X................
        ............X................
        .............X...............
        .............X...............
        ..............X..............
        ..............X..............
        .............................
        .............................
end
 if y=42 then playfield:
        ............X................
        ............X................
        ............X................
        .............X...............
        .............X...............
        .............X...............
        .............X...............
        ..............X..............
        ..............X..............
        .............................
        .............................
end
 if y=44 then playfield:
        .............X...............
        .............X...............
        .............X...............
        .............X...............
        .............X...............
        ..............X..............
        ..............X..............
        ..............X..............
        ..............X..............
        .............................
        .............................
end
 if y=46 then playfield:
        ..............X..............
        ..............X..............
        ..............X..............
        ..............X..............
        ..............X..............
        ..............X..............
        ..............X..............
        ..............X..............
        ..............X..............
        .............................
        .............................
end
 if y=48 then playfield:
        ...............X.............
        ...............X.............
        ...............X.............
        ...............X.............
        ...............X.............
        ..............X..............
        ..............X..............
        ..............X..............
        ..............X..............
        .............................
        .............................
end
 if y=50 then playfield:
        ................X............
        ................X............
        ................X............
        ...............X.............
        ...............X.............
        ...............X.............
        ...............X.............
        ..............X..............
        ..............X..............
        .............................
        .............................
end
 if y=52 then playfield:
        .................X...........
        .................X...........
        ................X............
        ................X............
        ................X............
        ...............X.............
        ...............X.............
        ..............X..............
        ..............X..............
        .............................
        .............................
end
 if y=54 then playfield:
        ..................X..........
        ..................X..........
        .................X...........
        .................X...........
        ................X............
        ................X............
        ...............X.............
        ...............X.............
        ..............X..............
        .............................
        .............................
end
 if y=56 then playfield:
        ...................X.........
        ..................X..........
        ..................X..........
        .................X...........
        .................X...........
        ................X............
        ...............X.............
        ...............X.............
        ..............X..............
        .............................
        .............................
end
 if y=58 then playfield:
        ....................X........
        ...................X.........
        ...................X.........
        ..................X..........
        .................X...........
        ................X............
        ................X............
        ...............X.............
        ..............X..............
        .............................
        .............................
end
 if y=60 then playfield:
        .....................X.......
        ....................X........
        ...................X.........
        ..................X..........
        ..................X..........
        .................X...........
        ................X............
        ...............X.............
        ..............X..............
        .............................
        .............................
end
 if y=62 then playfield:
        .....................X.......
        ....................X........
        ...................X.........
        ..................X..........
        .................X...........
        ................X............
        ...............X.............
        ..............X..............
        .............................
        .............................
end
 if y=64 then playfield:
        .......................X.....
        ......................X......
        .....................X.......
        ....................X........
        ..................XX.........
        .................X...........
        ................X............
        ...............X.............
        ..............X..............
        .............................
        .............................
        .............................
end
 if y=66 then playfield:
        ........................X....
        .......................X.....
        .....................XX......
        ....................X........
        ...................X.........
        ..................X..........
        ................XX...........
        ...............X.............
        ..............X..............
        .............................
        .............................
end
 if y=68 then playfield:
        .........................X...
        .......................XX....
        ......................X......
        .....................X.......
        ...................XX........
        ..................X..........
        .................X...........
        ...............XX............
        ..............X..............
        .............................
        .............................
end
 if y=70 then playfield:
        ..........................X..
        ........................XX...
        .......................X.....
        .....................XX......
        ....................X........
        ..................XX.........
        .................X...........
        ...............XX............
        ..............X..............
        .............................
        .............................
end
 if y=72 then playfield:
        ...........................X.
        .........................XX..
        .......................XX....
        ......................X......
        ....................XX.......
        ...................X.........
        .................XX..........
        ...............XX............
        ..............X..............
        .............................
        .............................
end
 if y=74 then playfield:
        ............................X
        ..........................XX.
        ........................XX...
        ......................XX.....
        ....................XX.......
        ...................X.........
        .................XX..........
        ...............XX............
        ..............X..............
        .............................
        .............................
end
 if y=76 then playfield:
        .............................
        ...........................XX
        .........................XX..
        .......................XX....
        .....................XX......
        ...................XX........
        .................XX..........
        ...............XX............
        ..............X..............
        .............................
        .............................
end
 if y=78 then playfield:
        .............................
        .............................
        ...........................XX
        .........................XX..
        .......................XX....
        ....................XXX......
        ..................XX.........
        ................XX...........
        ..............XX.............
        .............................
        .............................
end
 if y=80 then playfield:
        .............................
        .............................
        .............................
        ...........................XX
        ........................XXX..
        .....................XXX.....
        ...................XX........
        ................XXX..........
        ..............XX.............
        .............................
        .............................
end
 if y=82 then playfield:
        .............................
        .............................
        .............................
        .............................
        ...........................XX
        .......................XXXX..
        ....................XXXX.....
        ................XXXX.........
        ..............XX.............
        .............................
        .............................
end
 if y=84 then playfield:
        .............................
        .............................
        .............................
        .............................
        .............................
        ..........................XXX
        .....................XXXXX...
        .................XXXX........
        ..............XXX............
        .............................
        .............................
end
 if y=86 then playfield:
        .............................
        .............................
        .............................
        .............................
        .............................
        ..........................XXX
        .....................XXXXX...
        .................XXXX........
        ..............XXX............
        .............................
        .............................
end
 if y=88 then playfield:
        .............................
        .............................
        .............................
        .............................
        .............................
        .............................
        .........................XXXX
        ..................XXXXXXX....
        ..............XXXX...........
        .............................
        .............................
end
 if y=90 then playfield:
        .............................
        .............................
        .............................
        .............................
        .............................
        .............................
        .............................
        .....................XXXXXXXX
        ..............XXXXXXX........
        .............................
        .............................
end
 if y=92 then playfield:
        .............................
        .............................
        .............................
        .............................
        .............................
        .............................
        .............................
        .............................
        ..............XXXXXXXXXXXXXXX
        .............................
        .............................
end

2 个答案:

答案 0 :(得分:2)

使用众所周知的Bresenham line-drawing algorithm。您可以在RosettaCode在线找到许多版本。其中最具可读性的是:

// draw a line from x0, y0 to x1, y1
// from RosettaCode: https://rosettacode.org/wiki/Bitmap/Bresenham%27s_line_algorithm#JavaScript
function bresenhamLine(x0, y0, x1, y1) {
  console.log("Drawing line from ", x0, y0, " to ", x1, y1);
  var dx = Math.abs(x1 - x0), sx = x0 < x1 ? 1 : -1;
  var dy = Math.abs(y1 - y0), sy = y0 < y1 ? 1 : -1; 
  var err = (dx>dy ? dx : -dy)/2;
 
  while (true) {
    setPixel(x0,y0);
    if (x0 === x1 && y0 === y1) break;
    var e2 = err;
    if (e2 > -dx) { err -= dy; x0 += sx; }
    if (e2 < dy) { err += dx; y0 += sy; }
  }
}

// the code below is to test the algorithm

// set a single "pixel" (in this case, a cell in a table)
function setPixel(x, y) {
   $("#" + x + "_" + y).addClass("selected");
   console.log("setting pixel at ", x, y);
}

// create a wxh table that will draw lines when hovered over
function createTable(w, h) {
  for (var i=0; i<h; i++) {
    var row = ["<tr>"];
    for (var j=0; j<w; j++) {
      row.push("<td id=\"" + j + "_" + i + "\">");
    }
    $("#t").append(row.join(""))
  }
  $("td").hover(function() {
      $("td").removeClass("selected");
      var coords = $(this).attr("id").split("_");
      bresenhamLine(
        Math.floor(w/2), 
        Math.floor(h/2), 
        +coords[0], 
        +coords[1]);
  })
}


createTable(30, 30);
td { height: 3px; width: 3px; border: 1px solid white; }
td.selected { border: 1px solid blue; }
table { border: 1px solid black; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="t"></table>

Move the mouse to draw different lines using the Bresenham algorithm.

答案 1 :(得分:0)

小例子,你应该为try-catch函数写一些其他内容,因为使用它是'不好的做法'。

你给出一个坐标(x,y)和你想要通过这一点绘制的线的斜率。

var playfield = createEmptyPlayfield(29, 10);
drawLine(2,2, 1/3);
showPlayfield();

function drawLine(x, y, slope){
  for(i=0; i<playfield[0].length; i++){
    var xx = i;
    var yy = Math.round(y + (slope * i));
    try{
      playfield[yy][xx] = "X";
    } catch(e){
      //console.log("out of playfield");
    }
  }
}

function createEmptyPlayfield(width, height){
  var grid = [];
  for (i=0; i<height; i++){
    grid[i] = [];
    for(j=0; j<width; j++){
      grid[i][j] = 0;
    }
  }
  return grid;
}

function showPlayfield(){
  var str = "";
  for(i=0; i<playfield.length; i++){
    for(j=0; j<playfield[i].length; j++){
     str+= playfield[i][j];
    }
    str+="\n";
  }
  console.log(str);
}