使用JS画图之点、线、面


Posted in Javascript onJanuary 12, 2015

JS画图的想法经过大脑的时候,觉得有点意思,所以就实践了一番。JS画图为系列文章,本是讲点、线和面

先看样例:http://www.zhaojz.com.cn/demo/draw5.html

一、点

这里的点我们使用span标签表示

//描点,参数有点的大小,颜色,点的坐标和标签; 很明显opts参数是一个对象

function drawPoint(opts){

    document.write("<span id='"+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]?("<div style='position: relative;'><span style='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 参数

function drawLine(pstart, pend, opts){

    var ph = 1;

    var pw = 1;

    var color = "DarkRed";

    if(opts){

        color = opts.color ? opts.color: color;

    }

    var slope; //斜率

    var noSlope = false; //是否有斜率

    var hdist = pend[0] - pstart[0];

    var vdist = pend[1] - pstart[1];

    if(hdist != 0){

        slope =  Math.abs(vdist/hdist);  //计算斜率

    }else{

        noSlope = true; //当hdist=0时,直线没有斜率

    }

    var gapp = pw > ph ? ph : pw; //默认相邻点(左上角的像素点)间的距离

    

    var diagonal = Math.sqrt(Math.pow(hdist,2) + Math.pow(vdist,2)); //斜边长度

    var pn = parseInt(diagonal/gapp); //计算两点之间的点的数量

    if(pn < 3){pn=pn*3+1}; //如果点的数量小于3,则加大点数;为什么+1呢,是保证pn=0时至少有一个点

    var vgap = Math.abs(vdist)/pn; //相邻两点间的垂直距离

    var hgap = Math.abs(hdist)/pn; //相邻两点间的水平距离

    for(var i = 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 点的一维数组

function drawPolyline(ps){

    if(ps){

        //画线

        for(var i = 0; i<ps.length-1; i++){

            drawLine(ps[i], ps[i+1]);

        }

        //描拐点

        for(var i = 0; i<ps.length; i++){

            drawPoint({

                pw: 3,

                ph: 3,

                color: 'RED',

                point: ps[i]

            });

        }

        

    }

}

 

多边形:

//多边形

//ps 点的一维数组

function drawPolygon(ps){

    if(ps){

        //画线

        for(var i = 0; i<ps.length-1; i++){

            drawLine(ps[i], ps[i+1]);

        }

        //使闭合

        if(ps.length > 2){

            drawLine(ps[ps.length-1], ps[0])

        }

        //描拐点

        for(var i = 0; i<ps.length; i++){

            drawPoint({

                pw: 3,

                ph: 3,

                color: 'RED',

                point: ps[i]

            });

        }

    }

}

 

矩形:

//画矩形

//leftTop 左上角的点的位置

//width 宽

//high 高

function drawRectangle(leftTop, width, high){

    drawPolygon([

        leftTop,

        [leftTop[0], leftTop[1]+high],

        [leftTop[0]+width, leftTop[1]+high],

        [leftTop[0]+width, leftTop[1]]

    ]);

    //填充

    //document.write("<span style='height: "+(high-1)+"px; width: "+(width-1)+"px; background-color: "+"Green"+"; position: absolute; left:"+(leftTop[0]+1)+"px; top: "+(leftTop[1]+1)+"'></span>");

}

原来JS也可以做这么炫酷的事情,真是要好好研究下了

Javascript 相关文章推荐
上传的js验证(图片/文件的扩展名)
Apr 25 Javascript
JScript分割字符串示例代码
Sep 04 Javascript
javascript禁止访客复制网页内容的实现代码
Aug 05 Javascript
javascript实现3D变换的立体圆圈实例
Aug 06 Javascript
javascript实现图片轮播效果
Jan 20 Javascript
javascript html5 canvas实现可拖动省份的中国地图
Mar 11 Javascript
js字符串截取函数slice、substring和substr的比较
May 17 Javascript
jQuery实现的跨容器无缝拖动效果代码
Jun 21 Javascript
EditPlus中的正则表达式 实战(4)
Dec 15 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
Apr 25 Javascript
react中fetch之cors跨域请求的实现方法
Mar 14 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
Jul 30 Javascript
javascript定义变量时带var与不带var的区别分析
Jan 12 #Javascript
jQuery实现友好的轮播图片特效
Jan 12 #Javascript
js函数内变量的作用域分析
Jan 12 #Javascript
Jquery api 速查表分享
Jan 12 #Javascript
js常用系统函数用法实例分析
Jan 12 #Javascript
javascript使用appendChild追加节点实例
Jan 12 #Javascript
jQuery实现瀑布流的取巧做法分享
Jan 12 #Javascript
You might like
php字符串截取问题
2006/11/28 PHP
PHP常用代码大全(新手入门必备)
2010/06/29 PHP
浅谈json_encode用法
2015/03/05 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
Javascript实现的分页函数
2006/12/22 Javascript
jquery之Document元素选择器篇
2008/08/14 Javascript
利用腾讯的ip地址库做ip物理地址定位
2010/07/24 Javascript
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
JavaScript继承学习笔记【新手必看】
2016/05/10 Javascript
折叠菜单及选择器的运用
2017/02/03 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
详解python单元测试框架unittest
2018/07/02 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
2019/03/30 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
2019/05/31 Python
自适应线性神经网络Adaline的python实现详解
2019/09/30 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
VScode连接远程服务器上的jupyter notebook的实现
2020/04/23 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
完美解决keras保存好的model不能成功加载问题
2020/06/11 Python
Python常用库Numpy进行矩阵运算详解
2020/07/21 Python
HTML5和CSS3实例教程总结(推荐)
2016/07/18 HTML / CSS
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
幼儿园新学期寄语
2014/01/18 职场文书
捐献物资倡议书范文
2014/05/19 职场文书
企业宣传口号
2014/06/12 职场文书
岗位说明书标准范本
2014/07/30 职场文书
迎国庆演讲稿
2014/09/05 职场文书
大学生实习证明范本
2014/09/19 职场文书
社保代办委托书怎么写
2014/10/06 职场文书
工程部经理岗位职责
2015/02/02 职场文书