使用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的日期选择控件
Oct 27 Javascript
jquery里的正则表达式说明
Aug 03 Javascript
面向对象继承实例(a如何继承b问题)(自写)
Jul 01 Javascript
简单的代码实现jquery定时器
Nov 17 Javascript
JS替换文本域内的回车示例
Feb 18 Javascript
JavaScript程序员应该知道的45个实用技巧
Mar 04 Javascript
JS模拟实现Select效果代码
Sep 24 Javascript
详解webpack异步加载业务模块
Jun 23 Javascript
vue-router中scrollBehavior的巧妙用法
Jul 09 Javascript
element vue Array数组和Map对象的添加与删除操作
Nov 14 Javascript
解决ele ui 表格表头太长问题的实现
Nov 13 Javascript
Angular处理未可知异常错误的方法详解
Jan 17 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版淘宝网查询商品接口代码示例
2014/06/17 PHP
php实现读取手机客户端浏览器的类
2015/01/09 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
2016/11/08 PHP
PHP支付宝当面付2.0代码
2018/12/21 PHP
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
2011/05/24 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
json传值以及ajax接收详解
2016/05/24 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
2016/12/29 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
vue-cli3 热更新配置操作
2020/09/18 Javascript
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
[43:48]Ti4正赛第一天 VG vs NEWBEE 2
2014/07/19 DOTA
[03:21]辉夜杯主赛事 12月25日TOP5
2015/12/26 DOTA
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
python中合并两个文本文件并按照姓名首字母排序的例子
2014/04/25 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
Python爬取qq空间说说的实例代码
2018/08/17 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
解决Python一行输出不显示的问题
2018/12/03 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
python中温度单位转换的实例方法
2020/12/27 Python
爱尔兰灯和灯具网上商店:Lights.ie
2018/03/26 全球购物
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
C++:局部变量能否和全局变量重名
2014/03/03 面试题
文员个人的求职信范文
2013/09/26 职场文书
奖学金自我鉴定范文
2013/10/03 职场文书
顶岗实习计划书
2014/01/10 职场文书
文体活动实施方案
2014/03/27 职场文书
法人代表委托书
2014/04/04 职场文书
股权转让协议书范本
2014/04/12 职场文书
防沙治沙典型材料
2014/05/07 职场文书
学校党支部承诺书
2015/04/30 职场文书
公积金贷款承诺书
2015/04/30 职场文书
催款函范本大全
2015/06/24 职场文书