使用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 相关文章推荐
jquery $.ajax相关用法分享
Mar 16 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
Jul 30 Javascript
js简单网速测试方法完整实例
Dec 15 Javascript
整理关于Bootstrap过渡动画的慕课笔记
Mar 29 Javascript
mac上node.js环境的安装测试
Jul 03 Javascript
Javascript中 toFixed四舍六入方法
Aug 21 Javascript
jQuery超简单遮罩层实现方法示例
Sep 06 jQuery
如何从0开始用node写一个自己的命令行程序
Dec 29 Javascript
bootstrap tooltips在 angularJS中的使用方法
Apr 10 Javascript
js如何实现元素曝光上报
Aug 07 Javascript
Vuex模块化应用实践示例
Feb 03 Javascript
vue中的v-model原理,与组件自定义v-model详解
Aug 04 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记录日志的实现代码
2011/08/08 PHP
PHP根据两点间的经纬度计算距离
2014/10/31 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
ajax与302响应代码测试
2013/10/23 Javascript
使用jQuery解决IE与FireFox下createElement方法的差异
2013/11/14 Javascript
JQuery中基础过滤选择器用法实例分析
2015/05/18 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
bootstrap日期插件daterangepicker使用详解
2017/10/19 Javascript
浅谈使用React.setState需要注意的三点
2017/12/18 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
2018/05/06 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
python分析网页上所有超链接的方法
2015/05/08 Python
python中urlparse模块介绍与使用示例
2017/11/19 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
python 读写文件包含多种编码格式的解决方式
2019/12/20 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
python Xpath语法的使用
2020/11/26 Python
使用Python爬虫爬取小红书完完整整的全过程
2021/01/19 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
最畅销的视频游戏享受高达90%的折扣:CDKeys
2020/02/10 全球购物
学生上课看漫画的检讨书
2014/09/26 职场文书
教师工作证明范本
2015/06/12 职场文书
人间正道是沧桑观后感
2015/06/15 职场文书
2016医师资格考试考生诚信考试承诺书
2016/03/25 职场文书
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
2021/05/25 Vue.js
一文弄懂MySQL索引创建原则
2022/02/28 MySQL