使用js画图之圆、弧、扇形


Posted in Javascript onJanuary 12, 2015

半径为r的圆上的点p(x,y)与圆心O(x0,y0)的关系: x = x0+rcosA;  y = y0+rsinA ,A为弧度

样例:http://www.zhaojz.com.cn/demo/draw6.html

一、圆

//圆形/椭圆

//dot 圆点

//r 半径

//compressionRatio 垂直压缩比

function drawCircle(dot, r, compressionRatio, data){

    var pstart = [dot[0]+r, dot[1]]; //起点

    var pre = pstart; 

    for(var i=0; i < 360; i+=5){

        rad = i*Math.PI/180; //计算弧度

        //r*Math.cos(rad) 弧线的终点相对dot的水平偏移

        //r*Math.sin(rad) 弧线的终点相对dot的垂直偏移

        //compressionRatio 垂直压缩比例

        var cur = [r*Math.cos(rad)+dot[0], compressionRatio*r*Math.sin(rad)+dot[1]];

        drawLine(pre,cur);

        pre = cur; //保存当前点的坐标

    }

    drawLine(pre,pstart);//使闭合

    //描圆点

    drawPoint({

        pw:2,ph:2,color:'DarkRed',point:dot

    });

}

二、弧

就在画出圆的一部分,算法与圆相似

//画弧

//dot 圆点

//r 半径

//angle 圆心角

//angleOfSlope 与x轴的夹角

//pop 是否弹出

//title 标签

function drawArc(dot, r, angle, angleOfSlope, pop, title){

    var newDot = [dot[0], dot[1]];

    var a = (angleOfSlope+angle/2)*Math.PI/180; 

    if(pop){ //计算圆心的新坐标

        newDot[0] = dot[0]+10*Math.cos(a);

        newDot[1] = dot[1]+10*Math.sin(a);

    }

    if(!angleOfSlope){

        angleOfSlope = 0;

    }

    var aos = angleOfSlope*Math.PI/180;

    var aos2 = (angleOfSlope+angle)*Math.PI/180;

    var pstart = [newDot[0]+r*Math.cos(aos), newDot[1]+r*Math.sin(aos)]; //弧线的起点

    var pend = [newDot[0]+r*Math.cos(aos2), newDot[1]+r*Math.sin(aos2)]; //弧线的终点

    var pre = pstart;

    for(var i=0; i < angle; i+=2){ //在angle范围内画弧

        rad = (i+angleOfSlope)*Math.PI/180;

        var cur = [r*Math.cos(rad)+newDot[0], r*Math.sin(rad)+newDot[1]];

        drawLine(pre,cur);

        pre = cur;

    }

}

三、扇形

将弧的两端与圆心相连

//扇形

//dot 圆点

//r 半径

//angle 圆心角

//angleOfSlope 与x轴的夹角,确定扇形的方向

//pop 是否弹出,即是否偏离圆心

//title 标签

function drawSector(dot, r, angle, angleOfSlope, pop, title){

    var newDot = [dot[0], dot[1]];

    var a = (angleOfSlope+angle/2)*Math.PI/180; 

    if(pop){ //计算圆心的新坐标

        newDot[0] = dot[0]+10*Math.cos(a);

        newDot[1] = dot[1]+10*Math.sin(a);

    }

    if(!angleOfSlope){

        angleOfSlope = 0;

    }

    var aos = angleOfSlope*Math.PI/180;

    var aos2 = (angleOfSlope+angle)*Math.PI/180;

    var pstart = [newDot[0]+r*Math.cos(aos), newDot[1]+r*Math.sin(aos)]; //弧线的起点

    var pend = [newDot[0]+r*Math.cos(aos2), newDot[1]+r*Math.sin(aos2)]; //弧线的终点

    drawLine(newDot,pstart); //连接圆心与起点

    var pre = pstart;

    for(var i=0; i < angle; i+=2){ //在angle范围内画弧

        rad = (i+angleOfSlope)*Math.PI/180;

        var cur = [r*Math.cos(rad)+newDot[0], r*Math.sin(rad)+newDot[1]];

        drawLine(pre,cur);

        pre = cur;

    }

    drawPolyline([pre, pend, newDot]); //使闭合

    //描圆心

    drawPoint({

        pw:2,ph:2,color:'DarkRed',point:dot

    });

    //标签

    if(title){

        document.write("<span style='height: 24px; line-height: 24px; width: 80px; text-align: center; color: RED; position: absolute; left:"+(newDot[0]+r*(2/4)*Math.cos(a)-40)+"px; top: "+(newDot[1]+r*(2/4)*Math.sin(a)-12)+"'>"+title+"</span>");

    }

}

是不是很震撼,原来js也能做如此炫酷的事情。。。

Javascript 相关文章推荐
整理一些JavaScript的IE和火狐的兼容性注意事项
Mar 17 Javascript
ajax读取数据后使用jqchart显示图表的方法
Jun 10 Javascript
JS获取input file绝对路径的方法(推荐)
Aug 02 Javascript
基于vue的下拉刷新指令和滚动刷新指令
Dec 23 Javascript
JavaScript中Math对象的方法介绍
Jan 05 Javascript
easyUI combobox实现联动效果
Jan 17 Javascript
JavaScript原生数组Array常用方法
Apr 06 Javascript
javascript数组去重常用方法实例分析
Apr 11 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
May 10 Javascript
node.js爬取中关村的在线电瓶车信息
Nov 13 Javascript
JavaScript Canvas编写炫彩的网页时钟
Oct 16 Javascript
js实现简单扫雷
Nov 27 Javascript
js函数与php函数的区别实例浅析
Jan 12 #Javascript
使用JS画图之点、线、面
Jan 12 #Javascript
javascript定义变量时带var与不带var的区别分析
Jan 12 #Javascript
jQuery实现友好的轮播图片特效
Jan 12 #Javascript
js函数内变量的作用域分析
Jan 12 #Javascript
Jquery api 速查表分享
Jan 12 #Javascript
js常用系统函数用法实例分析
Jan 12 #Javascript
You might like
扩展你的 PHP 之入门篇
2006/12/04 PHP
PHP实现合并discuz用户
2015/08/05 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
从性能方面考虑PHP下载远程文件的3种方法
2015/12/29 PHP
Zend Framework教程之Zend_Config_Xml用法分析
2016/03/23 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
2020/04/27 PHP
PHP7 标准库修改
2021/03/09 PHP
setInterval 和 setTimeout会产生内存溢出
2008/02/15 Javascript
老鱼 浅谈javascript面向对象编程
2010/03/04 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
JavaScript Function函数类型介绍
2015/04/08 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
jQuery实现在新增加的元素上添加事件方法案例分析
2017/02/09 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
纯js实现画一棵树的示例
2017/09/05 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
Vue-Cli项目优化操作的实现
2019/10/27 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
关于Node.js中频繁修改代码重启服务器的问题
2020/10/15 Javascript
[32:26]EG vs IG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python使用os模块的os.walk遍历文件夹示例
2014/01/27 Python
python实现最长公共子序列
2018/05/22 Python
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
django的settings中设置中文支持的实现
2019/04/28 Python
python爬虫实现获取下一页代码
2020/03/13 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
2021/02/20 Python
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
小组口号大全
2014/06/09 职场文书
学校工作推荐信范文
2014/07/11 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python