使用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 相关文章推荐
event.X和event.clientX的区别分析
Oct 06 Javascript
原生JavaScript实现连连看游戏(附源码)
Nov 05 Javascript
简单易用的倒计时js代码
Aug 04 Javascript
第一次动手实现bootstrap table分页效果
Sep 22 Javascript
pc加载更多功能和移动端下拉刷新加载数据
Nov 07 Javascript
Ajax跨域实现代码(后台jsp)
Jan 21 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
Feb 15 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
Jul 25 Javascript
jQuery初级教程之网站品牌列表效果
Aug 02 jQuery
教你用Cordova打包Vue项目的方法
Oct 17 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
Apr 23 jQuery
JS伪继承prototype实现方法示例
Jun 20 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 如何获取二维数组中某个key的集合
2014/06/03 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
Yii使用技巧大汇总
2015/12/29 PHP
php基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
js parseInt(&quot;08&quot;)未指定进位制问题
2010/06/19 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
JavaScript实现的浮动层框架用法实例分析
2015/10/10 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
node.js利用mongoose获取mongodb数据的格式化问题详解
2017/10/06 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
小试SVG之新手小白入门教程
2019/01/08 Javascript
使用pm2部署node生产环境的方法步骤
2019/03/09 Javascript
详解JS实现系统登录页的登录和验证
2019/04/29 Javascript
用webpack4开发小程序的实现方法
2019/06/04 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
js实现简易计算器功能
2019/10/18 Javascript
详谈vue中router-link和传统a链接的区别
2020/07/22 Javascript
解读Python中degrees()方法的使用
2015/05/18 Python
Python中运算符&quot;==&quot;和&quot;is&quot;的详解
2016/10/08 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
2018/09/04 Python
Python3 读、写Excel文件的操作方法
2018/10/20 Python
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
Python中关于浮点数的冷知识
2019/09/22 Python
Python调用钉钉自定义机器人的实现
2020/01/03 Python
python str字符串转uuid实例
2020/03/03 Python
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
语文教育专业应届生求职信
2013/11/23 职场文书
ktv筹备计划书
2014/05/03 职场文书
信用卡工作证明模板
2014/09/14 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
投资意向协议书
2015/01/29 职场文书
2015年教研组工作总结
2015/05/04 职场文书
2016年清明节寄语
2015/12/04 职场文书