我今天做了一个实验,看看我能用<div>
做些什么。所以我制作了a simple Paint-like program,您可以使用<div>
s进行绘制。
$(window).mousemove(function(e){
if(!mousedown){
return false;
}
var x = e.clientX,
y = e.clientY;
drawDot(x,y,ele);
lastX = x;
lastY = y;
});
这是代码的一部分。它有效,但点之间存在间隙。所以我创建了一个名为fillDot
的函数,它将从A点(最后一个点)到B点(当前点)绘制一条线。
drawDot(x,y,ele);
fillDot(lastX,lastY,x,y,ele);
function fillDot(lx,ly,x,y,canvas){
var rise = y - ly,
run = x - lx,
slope = rise / run,
yInt = y - (slope * x);
if( lx < x ){
for(var i = lx; i < x ; i+=.5){
var y = slope * i + yInt;
drawDot(i,y,canvas);
}
}else if( x < lx ){
for(var i = x; i < lx ; i++){
var y = slope * i + yInt;
drawDot(i,y,canvas);
}
}
}
只有当我绘制水平线时它才能正常工作。当我从上到下或从下到上绘制时,仍然会有间隙。我找到了一个名为Bresenham's line algorithm的东西,它可以做同样的事情,但我不知道如何使用它......
知道如何填补其中的所有点吗?
ps:我知道有<canvas>
,但我正在测试我可以用<div>
做些什么。
答案 0 :(得分:1)
没关系,我把Bresenham的线算法翻译成JavaScript,现在它完美无缺!
function fillDot(x0, y0, x1, y1){
var dx = Math.abs(x1-x0);
var dy = Math.abs(y1-y0);
var sx = (x0 < x1) ? 1 : -1;
var sy = (y0 < y1) ? 1 : -1;
var err = dx-dy;
while(true){
drawDot(x0,y0);
if ((x0==x1) && (y0==y1)) break;
var e2 = 2*err;
if (e2>-dy){
err -= dy;
x0 += sx;
}
if (e2 < dx){
err += dx;
y0 += sy;
}
}
}