使用JS画图之点、线、面
JS画图的想法经过大脑的时候,觉得有点意思,所以就实践了一番。JS画图为系列文章,本是讲点、线和面
先看样例:http://www.zhaojz.com.cn/demo/draw5.html
一、点
这里的点我们使用span标签表示
//描点,参数有点的大小,颜色,点的坐标和标签;很明显opts参数是一个对象
functiondrawPoint(opts){
document.write("<spanid='"+opts.point[0]+""+opts.point[1]+"'style='display:inline-block;width:"+opts.pw+"px;height:"+opts.ph+"px;background-color:"+opts.color+";position:absolute"+opts.point[0]+"px;top:"+opts.point[1]+"px;'>"+(opts.point[2]?("<divstyle='position:relative;'><spanstyle='position:absolute;left:5px;bottom:1px;text-align:left;width:100px;'>"+opts.point[2]+"</span></div>"):"")+"</span>");
}
几个参数:
opts.pw:点的宽度
opts.ph:点的高度,一般与opts.pw相等
opts.color:点的颜色
opts.point:表示点的位置,point[0]:水平位置,point[1]:垂直位置point[2]为点的标签
注意:position属性,必须为absolute;
二、直线
直线是由点组成的嘛,因此我们要在两点之间描出n多个点。视觉上,它就是一条直线。
//画线
//pstart起点
//pend终点
//opts参数
functiondrawLine(pstart,pend,opts){
varph=1;
varpw=1;
varcolor="DarkRed";
if(opts){
color=opts.color?opts.color:color;
}
varslope;//斜率
varnoSlope=false;//是否有斜率
varhdist=pend[0]-pstart[0];
varvdist=pend[1]-pstart[1];
if(hdist!=0){
slope= Math.abs(vdist/hdist); //计算斜率
}else{
noSlope=true;//当hdist=0时,直线没有斜率
}
vargapp=pw>ph?ph:pw;//默认相邻点(左上角的像素点)间的距离
vardiagonal=Math.sqrt(Math.pow(hdist,2)+Math.pow(vdist,2));//斜边长度
varpn=parseInt(diagonal/gapp);//计算两点之间的点的数量
if(pn<3){pn=pn*3+1};//如果点的数量小于3,则加大点数;为什么+1呢,是保证pn=0时至少有一个点
varvgap=Math.abs(vdist)/pn;//相邻两点间的垂直距离
varhgap=Math.abs(hdist)/pn;//相邻两点间的水平距离
for(vari=0;i<pn;i++){
//描点
//hgap相邻两点间的水平距离
//vgap相邻两点间的垂直距离
//hgap*i*(pend[0]<pstart[0]?-1:1)*(noSlope?0:1)相对于起点的水平偏移
//vgap*i*(pend[1]<pstart[1]?-1:1)相对于起点的垂直偏移
//(pend[0]<pstart[0]?-1:1)水平偏移方向
//(pend[1]<pstart[1]?-1:1)垂直偏移方向
//(noSlope?0:1)直线没有斜率时,水平偏移为0
drawPoint({
pw:pw,
ph:ph,
color:color,
point:[(hgap*i*(pend[0]<pstart[0]?-1:1)*(noSlope?0:1)+pstart[0]),(vgap*i*(pend[1]<pstart[1]?-1:1)+pstart[1])]
});
}
}
在线的基础上可以画出折线和面:
折线:
//折线形
//ps点的一维数组
functiondrawPolyline(ps){
if(ps){
//画线
for(vari=0;i<ps.length-1;i++){
drawLine(ps[i],ps[i+1]);
}
//描拐点
for(vari=0;i<ps.length;i++){
drawPoint({
pw:3,
ph:3,
color:'RED',
point:ps[i]
});
}
}
}
多边形:
//多边形
//ps点的一维数组
functiondrawPolygon(ps){
if(ps){
//画线
for(vari=0;i<ps.length-1;i++){
drawLine(ps[i],ps[i+1]);
}
//使闭合
if(ps.length>2){
drawLine(ps[ps.length-1],ps[0])
}
//描拐点
for(vari=0;i<ps.length;i++){
drawPoint({
pw:3,
ph:3,
color:'RED',
point:ps[i]
});
}
}
}
矩形:
//画矩形
//leftTop左上角的点的位置
//width宽
//high高
functiondrawRectangle(leftTop,width,high){
drawPolygon([
leftTop,
[leftTop[0],leftTop[1]+high],
[leftTop[0]+width,leftTop[1]+high],
[leftTop[0]+width,leftTop[1]]
]);
//填充
//document.write("<spanstyle='height:"+(high-1)+"px;width:"+(width-1)+"px;background-color:"+"Green"+";position:absolute;left:"+(leftTop[0]+1)+"px;top:"+(leftTop[1]+1)+"'></span>");
}
原来JS也可以做这么炫酷的事情,真是要好好研究下了