使用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对象模型-执行模型
Apr 28 Javascript
动态调用CSS文件的JS代码
Jul 29 Javascript
window.requestAnimationFrame是什么意思,怎么用
Jan 13 Javascript
jquery分页插件AmSetPager(自写)
Apr 15 Javascript
jQuery模拟超链接点击效果代码
Apr 21 Javascript
js操作label给label赋值及取label的值示例
Nov 07 Javascript
JS、jQuery中select的用法详解
Apr 21 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
Sep 01 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
Jul 02 Javascript
JavaScript算法学习之冒泡排序和选择排序
Nov 02 Javascript
js实现简单音乐播放器
Jun 30 Javascript
vue cli4中mockjs在dev环境和build环境的配置详情
Apr 06 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
PHP新手上路(十)
2006/10/09 PHP
PHP开发入门教程之面向对象
2006/12/05 PHP
网站用php实现paypal整合方法
2010/11/28 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
2014/03/17 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
PHP crc32()函数讲解
2019/02/14 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
javascript引用类型指针的工作方式
2015/04/13 Javascript
jquery实现漂亮的二级下拉菜单代码
2015/08/26 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
2016/11/25 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
2017/05/19 jQuery
详解 vue.js用法和特性
2017/10/15 Javascript
NodeJS实现视频转码的示例代码
2017/11/18 NodeJs
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
Vue基于iview table展示图片实现点击放大
2020/08/05 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
python3 tcp的粘包现象和解决办法解析
2019/12/09 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
少年闰土教学反思
2014/02/22 职场文书
法人单位授权委托书范文
2014/10/06 职场文书
思想作风建设心得体会
2014/10/22 职场文书
学术研讨会欢迎词
2015/01/26 职场文书
人与自然观后感
2015/06/16 职场文书
分析MySQL抛出异常的几种常见解决方式
2021/05/18 MySQL
Go语言并发编程 sync.Once
2021/10/16 Golang
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis