使用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实现浏览器菜单命令
Sep 05 Javascript
ie下js不执行的几种可能
Feb 28 Javascript
jQuery获取table下某一行某一列的值实现代码
Apr 07 jQuery
详解Vue 事件驱动和依赖追踪
Apr 22 Javascript
echarts饼图扇区添加点击事件的实例
Oct 16 Javascript
vue中Axios的封装与API接口的管理详解
Aug 09 Javascript
vue计算属性computed的使用方法示例
Mar 13 Javascript
JavaScript显式数据类型转换详解
Mar 18 Javascript
js回溯法计算最佳旅行线路代码实例
Sep 11 Javascript
vue2.x 对象劫持的原理实现
Apr 19 Javascript
在实例中重学JavaScript事件循环
Dec 03 Javascript
vue实现可以快进后退的跑马灯组件
Apr 08 Vue.js
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
Cannot modify header information错误解决方法
2008/10/08 PHP
PHP $_SERVER详解
2009/01/16 PHP
php之Memcache学习笔记
2013/06/17 PHP
php中的curl使用入门教程和常见用法实例
2014/04/10 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
js 自动播放的实例代码
2013/11/19 Javascript
深入理解JavaScript系列(36):设计模式之中介者模式详解
2015/03/04 Javascript
jquery实现用户信息修改验证输入方法汇总
2015/07/18 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
JQuery自适应窗口大小导航菜单附源码下载
2015/09/01 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
JavaScript仿微博输入框效果(案例分析)
2016/12/06 Javascript
微信小程序 UI与容器组件总结
2017/02/21 Javascript
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
AngularJS实现表单元素值绑定操作示例
2017/10/11 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
2018/02/05 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
2018/04/21 Javascript
Vue.js仿Select下拉框效果
2020/02/18 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
利用Python检测URL状态
2019/07/31 Python
css3实现背景模糊的三种方式(小结)
2020/05/15 HTML / CSS
驴妈妈旅游网:中国新型的B2C旅游电子商务网站
2016/08/16 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
车工岗位职责
2013/11/26 职场文书
事业单位考核材料
2014/05/21 职场文书
2014年网管工作总结
2014/12/11 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
高中家长意见怎么写
2015/06/03 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书
《卖火柴的小女孩》教学反思
2016/02/19 职场文书