使用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 innerHTML使用分析
Dec 03 Javascript
gridpanel动态加载数据的实例代码
Jul 18 Javascript
Javascript中call的两种用法实例
Dec 13 Javascript
js定时调用方法成功后并停止调用示例
Apr 08 Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
Aug 10 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
Sep 17 Javascript
基于JavaScript实现前端文件的断点续传
Oct 17 Javascript
js实现一个简单的数字时钟效果
Mar 29 Javascript
Node中使用ES6语法的基础教程
Jan 05 Javascript
微信小程序之分享页面如何返回首页的示例
Mar 28 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
Nov 30 Javascript
JavaScript实现矩形块大小任意缩放
Aug 25 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
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
如何给phpcms v9增加类似于phpcms 2008中的关键词表
2013/07/01 PHP
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
php识别翻转iphone拍摄的颠倒图片
2018/05/17 PHP
php的instanceof和判断闭包Closure操作示例
2020/01/26 PHP
jQuery Ajax 实例全解析
2011/04/20 Javascript
30分钟就入门的正则表达式基础教程
2013/02/25 Javascript
一个检测表单数据的JavaScript实例
2014/10/31 Javascript
jquery实现的省市区三级联动
2015/04/02 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
原生JS实现导航下拉菜单效果
2020/11/25 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
2018/05/15 NodeJs
vue微信分享到朋友圈 vue微信发送给好友
2018/11/28 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
[04:45]DOTA2-DPC中国联赛正赛 iG vs LBZS 赛后选手采访
2021/03/11 DOTA
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
Python实现将目录中TXT合并成一个大TXT文件的方法
2015/07/15 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
Python元组知识点总结
2019/02/18 Python
在django view中给form传入参数的例子
2019/07/19 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
2020/04/07 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
Python如何定义接口和抽象类
2020/07/28 Python
用python发送微信消息
2020/12/21 Python
酒店管理毕业生自荐信
2013/10/24 职场文书
2014年计算机专业个人自我评价
2014/01/19 职场文书
大学毕业感言50字
2014/02/07 职场文书
建筑工程催款函
2015/06/24 职场文书
Css预编语言及区别详解
2021/04/25 HTML / CSS