出差总结1:利用js制作小人在自己画的多条折线上动态移动
来源:互联网 发布:wps怎么建立数据透视表 编辑:程序博客网 时间:2024/06/07 23:48
在这次出差中感觉学习到很多东西,故觉得自己应该用文字的形式记录一下,同时感谢公司牛人不知疲倦的指导我这个菜鸟:
由于图形系统中需要用到一个小功能:能在图形上画几根折线,然后能有个小人在上面移动,个人认为可以在地图中使用,有一定的实用性。同时这个只是最初的版本,有很多问题待解决,很多功能不具备,占用系统资源过多,希望以后能改进。
需要用到的知识:js,jquery,html,css,vml。下面说一下自己的思路。
1.动态画曲线:首先可以先考虑如何画直线,再组合成折线;或者可以直接用vml中的折线直接画。
具体思路:当鼠标按下时,开始画线(动态创建线的对象);鼠标移动时,画出具体折线;当鼠标松开时,确定一条直线;当右键松开时,线成收工。
变量定义:
var xx=0,yy=0 //定义X及Y坐标
var poly1=new Array();
var offsetFlag=new Array();//标志线走完
var moveobj = new Array(); //
var tempxx =new Array();var tempyy=new Array();
var _points=new Array();
var x1=new Array(); var x2=new Array(); var y1=new Array(); var y2=new Array();
var lineLength =new Array() ;
var pointsx=new Array();
var pointsy=new Array();
var allPoints =new Array();
var xl =0;
var tlength =new Array();
tlength[0] = 10;
var i =new Array();//点
i[0] =0;
//鼠标上的按钮被按下了
function div1.onmousedown()
{
div1.setCapture(); //画笔绘画开始,锁定鼠标
var yScrolltop;
var xScrollleft;
if (document.body)
{// all other Explorers
yScrolltop = document.body.scrollTop;
xScrollleft = document.body.scrollLeft;
}
xx=event.x+xScrollleft;
yy=event.y+yScrolltop;
if(event.button==1)
{
if(poly1[xl]==null)
{
_points[xl]= xx+ ',' +yy ;
pointsx[xl]=new Array();
pointsy[xl]=new Array();
poly1[xl]=document.createElement('<v:PolyLine filled="false" Points="'+_points[xl]+'" style="position:absolute"/>');
div1.appendChild(poly1[xl]);
//moveobj[xl] =document.createElement('<img src="1.gif" style="position:absolute;z-index:10;width:60;height:60;" id="img'+xl+'" border=0>')
moveobj[xl]= document.createElement('<img src="1.gif" style="position:absolute;z-index:10;width:60;height:60;left:111" id="img'+xl+'" border=0>');
div2.appendChild(moveobj[xl]);
// alert(moveobj[xl].id);
}
else
{
_points[xl]+= ',' + xx + ',' + yy;
}
}
}
//鼠标移动时触发的事件
function div1.onmousemove()
{
var yScrolltop;
var xScrollleft;
window.status=event.x+" - " +event.y
if (document.body)
{// all other Explorers
yScrolltop = document.body.scrollTop;
xScrollleft = document.body.scrollLeft;
}
tempx=event.x+xScrollleft;
tempy=event.y+yScrolltop;
if(poly1[xl]!=null)
{
poly1[xl].Points.value=_points[xl]+ ","+ (tempx) +","+(tempy);
}
}
//鼠标按下后,松开时激发的事件
function div1.onmouseup()
{
document.releaseCapture();
if (document.body)
{// all other Explorers
yScrolltop = document.body.scrollTop;
xScrollleft = document.body.scrollLeft;
}
//alert(yScrolltop);
tempx=event.x+xScrollleft;
tempy=event.y+yScrolltop;
if(tempx>document.body.offsetWidth+xScrollleft){return alert("X坐标越界")}
if(tempy>document.body.offsetHeight+yScrolltop){return alert("Y坐标越界")}
if(event.button==2&&poly1[xl]!=null)
{
poly1[xl].Points.value=_points[xl]
poly1[xl]=null;
getxy();
alert(allPoints[xl]);
xl += 1;
i[xl]=0;
tlength[xl] = 10;
// setInterval("playPoly("+xl+")",1000) ;
}
}
function getxy()
{
allPoints[xl] = new Array();
allPoints[xl] =_points[xl].split(",");
// if(allPoints.length<=2)
// {
// return;
// }
getpoints();
}
function getpoints()
{
var m=0;
var n =0;
for(j = 0;j<allPoints[xl].length;j++)
{
if(j%2==0)
{
pointsx[xl][m]= parseFloat(allPoints[xl][j]);
m++;
}
else
{
pointsy[xl][n] = parseFloat(allPoints[xl][j]);
n++;
}
}
}
2.当画完线以后,就可以让小人在上面移动。实际上是让一个图形动态的改变它的坐标,看上去像走的一样。这里用到的直线函数(想想学计算机这么多年终于用到数学知识了,而且还是初中数学,真是惭愧!),必须考虑x,y四个方向和垂直情况;这里有两种算法:当改变坐标时,以x,y为增量或以斜线为增量,个人认为以斜线较为准确;当移动时可以以下个坐标为原始点。
function playPoly(xl)
{
if(allPoints[xl].length>2)
{
if(!offsetFlag[xl])
{
i[xl] = 0;
tempi =i[xl];
tlength[xl] = 10;
tempxx[xl]= pointsx[xl][0];
tempxx[xl]= pointsy[xl][0];
x1[xl]= pointsx[xl][tempi];
y1[xl] = pointsy[xl][tempi];
x2[xl] = pointsx[xl][tempi+1];
y2[xl] = pointsy[xl][tempi+1];
lineLength[xl] =Math.sqrt(Math.pow(Math.abs(y2[xl]-y1[xl]),2)+Math.pow(Math.abs(x2[xl]-x1[xl]),2));
offsetFlag[xl]=true;
}
if (offsetFlag[xl])
{
//alert(i[xl]);
tempi = i[xl];
x1[xl]= pointsx[xl][tempi];
y1[xl] = pointsy[xl][tempi];
x2[xl] = pointsx[xl][tempi+1];
y2[xl] = pointsy[xl][tempi+1];
lineLength[xl] =Math.sqrt(Math.pow(Math.abs(y2[xl]-y1[xl]),2)+Math.pow(Math.abs(x2[xl]-x1[xl]),2));
var subx = x1[xl] - x2[xl];
if(subx<-10)
{
subx = -1;
}
else if(subx>10)
{
subx =1;
}
else if(x1[xl] - x2[xl]>=-10&&x1[xl] - x2[xl]<=10)
{
subx = 0;
}
switch(subx)
{
case -1:
if(tlength[xl]<lineLength[xl])
{
tempxx[xl] = (tlength[xl]*(x2[xl]-x1[xl]))/lineLength[xl]+x1[xl];
if(y1[xl]<y2[xl])
{
tempyy[xl] = (tlength[xl]*Math.abs(y2[xl]-y1[xl]))/lineLength[xl]+y1[xl];
}
else
{
tempyy[xl] = y1[xl]-(tlength[xl]*Math.abs(y2[xl]-y1[xl]))/lineLength[xl];
}
tlength[xl] += 10;
}
if(((tlength[xl]*(x2[xl]-x1[xl]))/lineLength[xl]+x1[xl])>x2[xl])
{
i[xl]++;
tlength[xl] = 10;
}
break;
case 1:
if(tlength[xl]<lineLength[xl])
{
tempxx[xl] = x1[xl]-(tlength[xl]*(x1[xl]-x2[xl]))/lineLength[xl];
if(y1[xl]<y2[xl])
{
tempyy[xl] = y1[xl]+(tlength[xl]*Math.abs(y2[xl]-y1[xl]))/lineLength[xl];
}
else
{
tempyy[xl] = y1[xl]-(tlength[xl]*Math.abs(y2[xl]-y1[xl]))/lineLength[xl];
}
tlength[xl] += 10;
}
if((x1[xl]-(tlength[xl]*(x1[xl]-x2[xl]))/lineLength[xl])<x2[xl])
{
i[xl]++;
tlength[xl] = 10;
}
break;
case 0:
tempxx[xl] = x1[xl];
if(y2[xl]>y1[xl])
{
tempyy[xl] = y1[xl]+tlength[xl];
tlength[xl] += 10;
if((tempyy[xl])>=y2[xl])
{
i[xl]++;
tlength[xl] = 10;
}
}
else if(y2[xl]<=y1[xl])
{
tempyy[xl] = y1[xl]-tlength[xl];
tlength[xl] += 10;
if((tempyy[xl])<=y2[xl])
{
i[xl]++;
tlength[xl] = 10;
}
}
break;
}
// window.status=tempxx[xl];
moveobj[xl].style.left=tempxx[xl];
moveobj[xl].style.top=tempyy[xl];
}
//alert(lineLength[xl]<=tlength[xl]+10);
var psx = pointsx[xl].length;
//alert(x1[xl]);
if(subx!=0)
{
if(pointsx[xl][psx-1] == x1[xl])
{
offsetFlag[xl]=false;
}
if(pointsy[xl][psx-1] == y1[xl])
{
offsetFlag[xl]=false;
}
}
if(subx==0)
{
if(pointsy[xl][psx-1] == y1[xl])
{
offsetFlag[xl]=false;
}
}
}
}
3.多条折线,多个小人移动对象算法类似!
- 出差总结1:利用js制作小人在自己画的多条折线上动态移动
- 【Unity3D】用虚拟增强现实技术制作立在图片上的立体小人教程①
- 纯JS网页上的动态折线图
- Flot画动态折线图 (两条折线动态的)
- 如何利用Bacon 2D来在Ubuntu平台上制作自己的游戏
- 在CocoaPods上制作自己的库
- 利用VFP在INTERNET上制作数据库动态查询
- 动态滚轴折线图,多条
- 输出移动小人的程序
- 利用canvas+Chart.js实现动态折线图
- js动态移动滚动条至底部
- 在linux下如何制作自己的动态连接库
- 利用Achartengine制作折线图
- 在python上使用wordcloud制作自己的词云
- plot图画多条折线图,如何把所有的折线都包含在图中呢(坐标轴范围如何设置)
- 利用CodeSmith在自己的工程中动态生成代码
- C乐趣之移动的小人
- 在Caffe上利用自己的数据集进行微调
- 呵呵
- 提高Linux系统性能加速网络应用程序
- 跟ASP.NET MVC一起使用jQuery
- Difference between gcc -fpic and -fPIC
- gridview 导出到excel
- 出差总结1:利用js制作小人在自己画的多条折线上动态移动
- 成功环境对成功者的必要性分析
- ubuntu 自动安装nv显卡驱动
- extern使用方法总结!
- 关于BAPI_PO_CREATE1
- SEO之心态调整篇
- baidu搜索排名的基本原则
- 已有打开的与此命令相关联的 DataReader,必须首先将它关闭
- SEO=用户体验+蜘蛛体验