使用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代码超级推荐
Apr 05 Javascript
关于 文本框默认值 的操作js代码
Jan 12 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
Jun 20 Javascript
JS.getTextContent(element,preformatted)使用介绍
Sep 21 Javascript
node.js中的fs.write方法使用说明
Dec 15 Javascript
jQuery插件pagination实现分页特效
Apr 12 Javascript
使用jquery获取url及url参数的简单实例
Jun 14 Javascript
微信js-sdk分享功能接口常用逻辑封装示例
Oct 13 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
Dec 13 Javascript
深入探究node之Transform
Jul 20 Javascript
使用Node.js搭建静态资源服务详细教程
Aug 02 Javascript
js实现多个标题吸顶效果
Jan 08 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
详细介绍:Apache+PHP+MySQL配置攻略
2006/09/05 PHP
php xml-rpc远程调用
2008/12/19 PHP
php实现快速排序的三种方法分享
2014/03/12 PHP
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
jquery提取元素里的纯文本不包含span等里的内容
2013/09/30 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
2016/01/08 Javascript
微信小程序 教程之数据绑定
2016/10/18 Javascript
RGB和YUV 多媒体编程基础详细介绍
2016/11/04 Javascript
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
JavaScript实现复选框全选和取消全选
2020/11/20 Javascript
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
python实现学员管理系统
2019/02/26 Python
Python正则表达式匹配和提取IP地址
2019/06/06 Python
Python Django切换MySQL数据库实例详解
2019/07/16 Python
django框架创建应用操作示例
2019/09/26 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
Django 解决由save方法引发的错误
2020/05/21 Python
python super()函数的基本使用
2020/09/10 Python
别名指示符是什么
2012/10/08 面试题
导游个人求职信范文
2014/03/23 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
起诉离婚协议书样本
2014/11/25 职场文书
教师工作表现自我评价
2015/03/05 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
关于PHP数组迭代器的使用方法实例
2021/11/17 PHP
浅谈Vue的computed计算属性
2022/03/21 Vue.js
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android