使用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 上下滚动广告
Jun 17 Javascript
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
Sep 27 Javascript
ajax中get和post的说明及使用与区别
Dec 23 Javascript
jquery动态增加删除表格行的小例子
Nov 14 Javascript
Jquery之Bind方法参数传递与接收的三种方法
Jun 24 Javascript
javascript 使用for循环时该注意的问题-附问题总结
Aug 19 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
Jan 28 Javascript
jQuery中ajax错误调试分析
Dec 01 Javascript
canvas基础绘制-绚丽倒计时的实例
Sep 17 Javascript
详解webpack + react + react-router 如何实现懒加载
Nov 20 Javascript
vue项目打包后打开页面空白解决办法
Jun 29 Javascript
vue滑动吸顶及锚点定位的示例代码
May 10 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简单系统查询模块代码打包下载
2008/06/07 PHP
PHP及Zend Engine的线程安全模型分析
2011/11/10 PHP
PHP 自定义错误处理函数trigger_error()
2013/03/26 PHP
PHP实现简单的新闻发布系统实例
2015/07/28 PHP
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
通过javascript把图片转化为字符画
2013/10/24 Javascript
Js nodeType 属性全面解析
2013/11/14 Javascript
Iframe 自动适应页面的高度示例代码
2014/02/26 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
分享JavaScript与Java中MD5使用两个例子
2015/12/23 Javascript
基于JS判断iframe是否加载成功的方法(多种浏览器)
2016/05/13 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
2016/06/12 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
2016/08/16 Javascript
BootStrap入门教程(三)之响应式原理
2016/09/19 Javascript
Bootstrap表单制作代码
2017/03/17 Javascript
JavaScript 获取元素在父节点中的下标(推荐)
2017/06/28 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
使用puppeteer爬取网站并抓出404无效链接
2018/12/20 Javascript
总结4个方面优化Vue项目
2019/02/11 Javascript
Jquery的autocomplete插件用法及参数讲解
2019/03/12 jQuery
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
对python产生随机的二维数组实例详解
2018/12/13 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
python实现学生成绩测评系统
2020/06/22 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
TripAdvisor德国:全球领先的旅游网站
2017/12/07 全球购物
温泉秘密:Onsen Secret
2020/07/06 全球购物
产品促销活动策划书
2014/01/15 职场文书
点菜员岗位职责范本
2014/02/14 职场文书
个人委托书格式
2014/04/04 职场文书
大学生党员批评与自我批评范文
2014/10/14 职场文书
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
德劲DE1107指针试高灵敏度全波段收音机机评
2022/04/05 无线电