使用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 29 Javascript
jquery简单插件制作(fn.extend)完整实例
May 24 Javascript
详解JS中的this、apply、call、bind(经典面试题)
Sep 19 Javascript
微信小程序实现简单input正则表达式验证功能示例
Nov 30 Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
Jan 05 Javascript
JS中Map和ForEach的区别
Feb 05 Javascript
基于JS实现带动画效果的流程进度条
Jun 01 Javascript
js实现敏感词过滤算法及实现逻辑
Jul 24 Javascript
Angular使用cli生成自定义文件、组件的方法
Sep 04 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
Sep 21 Javascript
Node.js API详解之 util模块用法实例分析
May 09 Javascript
jQuery 添加元素和删除元素的方法
Jul 15 jQuery
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下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
php 解压rar文件及zip文件的方法
2014/05/05 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
深入解析PHP底层机制及相关原理
2020/12/11 PHP
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
JS表的模拟方法
2015/02/05 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
jquery取消事件冒泡的三种方法(推荐)
2016/05/28 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
创建简单的node服务器实例(分享)
2017/06/23 Javascript
VUE中的无限循环代码解析
2017/09/22 Javascript
vue实现百度下拉列表交互操作示例
2019/03/12 Javascript
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
node获取客户端ip功能简单示例
2019/08/24 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
[03:56]显微镜下的DOTA2第十一期——鬼畜的死亡先知播音员
2014/06/23 DOTA
python提取照片坐标信息的实例代码
2019/08/14 Python
CSS3实现精美横向滚动菜单按钮
2017/04/14 HTML / CSS
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
美国在线艺术商店:HandmadePiece
2020/11/06 全球购物
信息学院毕业生自荐信范文
2014/03/04 职场文书
抽奖活动主持词
2014/03/31 职场文书
大学新生军训方案
2014/05/03 职场文书
美国留学经济担保书
2014/05/20 职场文书
员工趣味活动方案
2014/08/27 职场文书
求职自我评价范文100字
2014/09/23 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
学校计划生育责任书
2015/05/09 职场文书
2015年国庆节标语大全
2015/07/30 职场文书
四群教育工作总结
2015/08/10 职场文书
新西兰:最新留学学习计划书写作指南
2019/07/15 职场文书
Python如何把不同类型数据的json序列化
2021/04/30 Python
pycharm安装深度学习pytorch的d2l包失败问题解决
2022/03/25 Python