使用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 getElementsByClassName实现代码
Oct 11 Javascript
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
Nov 22 Javascript
js charAt的使用示例
Feb 18 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
May 08 Javascript
jQuery实现每隔几条元素增加1条线的方法
Jun 27 Javascript
jQuery设置Easyui校验规则(推荐)
Nov 21 Javascript
解析Javascript单例模式概念与实例
Dec 05 Javascript
self.attachevent is not a function的解决方法
Apr 04 Javascript
vue-cli监听组件加载完成的方法
Sep 07 Javascript
详解基于vue-cli3快速发布一个fullpage组件
Mar 08 Javascript
Vue对象赋值视图不更新问题及解决方法
Jun 03 Javascript
vite2.0+vue3移动端项目实战详解
Mar 03 Vue.js
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
《星际争霸2》终章已出 RTS时代宣告终结
2017/02/07 星际争霸
一步一步学习PHP(2)――PHP类型
2010/02/15 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
php微信公众号开发之简答题
2018/10/20 PHP
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
jQuery中add()方法用法实例
2015/01/08 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
Extjs让combobox写起来简洁又漂亮
2017/01/05 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
微信小程序云开发之使用云存储
2019/05/17 Javascript
ES6 Iterator接口和for...of循环用法分析
2019/07/31 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
Python内置模块turtle绘图详解
2017/12/09 Python
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
Python操作mongodb的9个步骤
2018/06/04 Python
Django REST framework视图的用法
2019/01/16 Python
python批量解压zip文件的方法
2019/08/20 Python
python对验证码降噪的实现示例代码
2019/11/12 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
英国探险旅游专家:Explore
2018/12/20 全球购物
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
介绍一下grep命令的使用
2015/06/12 面试题
2014新年寄语
2014/01/20 职场文书
2014年父亲节活动方案
2014/03/06 职场文书
个人三严三实对照检查材料
2014/09/25 职场文书
会计主管竞聘书
2015/09/15 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书
如何使用vue3打造一个物料库
2021/05/08 Vue.js
Python机器学习之基础概述
2021/05/19 Python