使用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 相关文章推荐
jquery tools系列 expose 学习
Sep 06 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
Jan 27 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
Dec 26 Javascript
jquery弹出层类代码分享
Dec 27 Javascript
node.js学习总结之调式代码的方法
Jun 25 Javascript
简单方法判断JavaScript对象为null或者属性为空
Sep 26 Javascript
JQUERY简单按钮轮换选中效果实现方法
May 07 Javascript
15款最好的Bootstrap在线编辑器
Aug 03 Javascript
Vue.js Ajax动态参数与列表显示实现方法
Oct 20 Javascript
抖音上用记事本编写爱心小程序教程
Apr 17 Javascript
js/jQuery实现全选效果
Jun 17 jQuery
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
Jul 25 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
动漫定律:眯眯眼都是怪物!这些角色狠话不多~
2020/03/03 日漫
php文件读取方法实例分析
2015/06/20 PHP
jquery+php实现导出datatables插件数据到excel的方法
2015/07/06 PHP
php检测文本的编码
2015/07/26 PHP
twig模板常用语句实例小结
2016/02/04 PHP
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
2016/01/27 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
jQuery EasyUI ProgressBar进度条组件
2017/02/28 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
详解如何创建并发布一个 vue 组件
2018/11/08 Javascript
js+html5 canvas实现ps钢笔抠图
2019/04/28 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
Python中实现最小二乘法思路及实现代码
2018/01/04 Python
微信跳一跳python自动代码解读1.0
2018/01/12 Python
pow在python中的含义及用法
2019/07/11 Python
用python实现英文字母和相应序数转换的方法
2019/09/18 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
浅谈HTML5新增和废弃的标签
2019/04/28 HTML / CSS
荷兰皇家航空公司中国官网:KLM中国
2017/12/13 全球购物
LUISAVIAROMA中国官网:时尚奢侈品牌购物网站
2020/11/01 全球购物
波兰最大的电商平台:Allegro.pl
2021/02/06 全球购物
护士自我鉴定
2013/10/23 职场文书
中学老师的自我评价
2013/11/07 职场文书
宿舍违规检讨书
2014/01/12 职场文书
《老王》教学反思
2014/02/23 职场文书
《广玉兰》教学反思
2014/04/14 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
婚前协议书范本两则
2014/10/16 职场文书
2015军训通讯稿大全
2015/07/18 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
Vue操作Storage本地化存储
2022/04/29 Vue.js
Python实现双向链表基本操作
2022/05/25 Python