使用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 Easyui Tree的oncheck事件实现代码
May 28 Javascript
js setTimeout opener的用法示例详解
Oct 23 Javascript
js构造函数、索引数组和属性的实现方式和使用
Nov 16 Javascript
Angular.js回顾ng-app和ng-model使用技巧
Apr 26 Javascript
jQuery实现邮箱下拉列表自动补全功能
Sep 08 Javascript
完全深入学习Bootstrap表单
Nov 28 Javascript
利用vue写todolist单页应用
Dec 15 Javascript
JS加密插件CryptoJS实现AES加密操作示例
Aug 16 Javascript
解决vue点击控制单个样式的问题
Sep 05 Javascript
React中this丢失的四种解决方法
Mar 12 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
Jul 10 Javascript
JS扁平化输出数组的2种方法解析
Sep 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 文件上传全攻略
2010/04/28 PHP
php flv视频时间获取函数
2010/06/29 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
前端必学之PHP语法基础
2016/01/01 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
DIV+CSS+JS不间断横向滚动实现代码
2013/03/19 Javascript
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
2016/01/30 Javascript
简单的分页代码js实现
2016/05/17 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
浅谈Angularjs link和compile的使用区别
2016/10/21 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
jQuery实现表格隔行换色
2018/09/01 jQuery
vue首次赋值不触发watch的解决方法
2018/09/11 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
2018/11/13 Javascript
Python3实现从指定路径查找文件的方法
2015/05/22 Python
Linux中安装Python的交互式解释器IPython的教程
2016/06/13 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
台湾专柜女包:KINAZ
2019/12/26 全球购物
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
工商管理应届生求职信
2013/10/07 职场文书
雏鹰争章活动总结
2014/05/09 职场文书
房屋出售授权委托书
2014/10/12 职场文书
寒暑假实习证明书模板
2014/11/29 职场文书
技术员岗位职责范本
2015/04/11 职场文书
博士论文答辩开场白
2015/06/01 职场文书
tensorflow中的梯度求解及梯度裁剪操作
2021/05/26 Python
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python
Python中json.load()和json.loads()有哪些区别
2021/06/07 Python