<html><head>
<style>
div{background-color:#000;height:1px;width:1px;position:absolute;overflow:hidden;}
span{background-color:red;height:20px;width:20px;position:absolute;overflow:hidden;}
</style>
</head><body></body></html>
<script>
//by x!ao_f 120000512
var xp = [];
var yp = [];
var ind = 0;
document.onmousedown = function(e) {
e = window.event||e;
xp[ind] = e.x||e.pageX;
yp[ind] = e.y||e.pageY;
if (ind == 0) {
ind++;
xp[ind] = e.x||e.pageX;
yp[ind] = e.y||e.pageY;
}
document.body.innerHTML = "";
posData = [];
BSPLine(xp, yp, ind, 10);
ind++;
}
//拟合曲线算法
function BSPLine(x,y,n,k) {
var i, j;
var t, t1, t2, a, b, c, tx, ty, sx, sy;
x[0] = x[1];
y[0] = y[1];
x[n + 1] = x[n];
y[n + 1] = y[n];
t = 1.0 / k;
sx = (x[0] + x[1]) / 2;
sy = (y[0] + y[1]) / 2;
for (i = 0; i < n; i++) {
for (j = 1; j < k; j++) {
t1 = j * t;
t2 = t1 * t1;
a = (t2 - 2 * t1 + 1) / 2;
b = t1 - t2 + 1 / 2;
c = t2 / 2;
tx = a * x[i] + b * x[i + 1] + c * x[i + 2];
ty = a * y[i] + b * y[i + 1] + c * y[i + 2];
Line(sx, sy, tx, ty);
sx = tx;
sy = ty;
}
}
Update();
}
//直线算法
function Line(x0,y0,x1,y1){
var ary = [];
var tmp;
var steep = Math.abs(y1 - y0) > Math.abs(x1 - x0);
var rev = false;
if(steep){
tmp = x0; x0 = y0; y0 = tmp;
tmp = x1; x1 = y1; y1 = tmp;
}
if(x0 > x1){
tmp = x0; x0 = x1; x1 = tmp;
tmp = y0; y0 = y1; y1 = tmp;
rev = true;
}
var deltax = Math.abs(x1 - x0);
var deltay = Math.abs(y1 - y0);
var error = deltax / 2;
var ystep;
var y = y0;
if(y0 < y1) ystep = 1; else ystep = -1;
for(var x = x0; x <= x1; x++){
if(steep){
if(rev){
ary.unshift(x);
ary.unshift(y);
}else{
ary.push(y);
ary.push(x);
}
}else{
if(rev){
ary.unshift(y);
ary.unshift(x);
}else{
ary.push(x);
ary.push(y);
}
}
error = error - deltay;
if(error < 0){
y = y + ystep;
error = error + deltax;
}
}
for(var i=0;i<ary.length;i+=2){
Pos(ary[i],ary[i+1]);
}
}
var cache = [];
var posData = [];
//像素点画到缓存
function Pos(x,y){
posData.push(x);
posData.push(y);
cache.push("<div style=left:");
cache.push(x);
cache.push("px;top:");
cache.push(y);
cache.push("px></div>");
}
//将路径显示到Body
function Update(){
document.body.innerHTML=cache.join("");
if(posData.length>0){
cache = ["<span id=r style=left:",(posData[0]-10),"px;top:"+(posData[1]-10)+"px></span>"];
}else{
cache = [];
}
}
//按任意键执行动画
var posind = 0;
document.οnkeydοwn=function(e){
var e = e||event
if(e.keyCode==13){
document.οnmοusedοwn=null;
window.setInterval(function(){
if(posind<posData.length){
r.style.left=parseInt(posData[posind++]-10)+"px";
r.style.top=parseInt(posData[posind++]-10)+"px";
posind+=2;
}
},1)
}
}
</script>
用法:
用鼠标点击画出轨迹,之后按ctrl+enter键播放