Среда программирования:
Любая
Статья по теме:
Провести прямую линию между двумя точками, заданными своими координатами. Использовать растровый алгоритм Брезенхэма.
Алгоритм основан на том, что для каждой точки растра существует ровно 4 соседних точки. Это означает, что две соседние точки могут отличаться друг от друга только по одной координате и только на 1 единицу. Т. е. для точки (x, y) соседними являются точки (x+1, y), (x-1, y), (x, y+1), (x, y-1). Точка (x+1, y+1) может оказаться закрашенной только если закрашена точка (x+1, y) или (x, y+1). Алгоритм Брезенхема модифицированный по такому закону реализован в данной программе. Так же реализована функция установки пикселя. Линии рисуются в любую сторону
Код программы:
//Создаем канвас var canvasElem= document.createElement('canvas'); canvasElem.id = "canvas"; canvasElem.width = 600; canvasElem.height = 600; canvasElem.style.margin = 'auto'; canvasElem.style.display = 'flex'; document.body.appendChild(canvasElem); canvas = canvasElem.getContext('2d'); //для правильной работы программы необходимо чтоб переменная canvas содержала 2d context какого либо канваса var plot = function(x, y) { //кисточка - ставит пиксель своего цвета if(isFinite(x) && isFinite(y)){ setPixel(x,y, plot.color); } }; function setPixel (x,y,c) { //ставит пиксель цвета с var p=canvas.createImageData(1,1); p.data[0]=c.r; p.data[1]=c.g; p.data[2]=c.b; p.data[3]=c.a; var data = canvas.getImageData(x, y, 1,1).data; if(data[3] <= p.data[3]) //сравниваем прозрачность canvas.putImageData(p,x,y); } function drawLine(x1, y1, x2, y2, color) { if(color) { plot.color = color; } else { plot.color = {r:0,g:0,b:0,a:255}; //цвет по умолчанию - черный } var deltaX = Math.abs(x2 - x1); var deltaY = Math.abs(y2 - y1); var signX = x1 < x2 ? 1 : -1; var signY = y1 < y2 ? 1 : -1; // var error = deltaX - deltaY; // plot(x2, y2); while(x1 != x2 || y1 != y2) { plot(x1, y1); var error2 = error * 2; // if(error2 > -deltaY) { error -= deltaY; x1 += signX; } if(error2 < deltaX) { error += deltaX; y1 += signY; } } }
Прикрепленный файл | Размер |
---|---|
opryshko_index_html.zip | 1.17 кб |