使用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 相关文章推荐
Mootools 1.2教程 类(一)
Sep 15 Javascript
JS继承用法实例分析
Feb 05 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
Sep 04 Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
Feb 07 Javascript
AngularJS实时获取并显示密码的方法
Feb 06 Javascript
利用vue和element-ui设置表格内容分页的实例
Mar 02 Javascript
vue-router传参用法详解
Jan 19 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
Feb 03 Javascript
AJAX XMLHttpRequest对象创建使用详解
Aug 20 Javascript
在vs code 中如何创建一个自己的 Vue 模板代码
Nov 10 Javascript
vue-router中hash模式与history模式的区别
Jun 23 Vue.js
5种 JavaScript 方式实现数组扁平化
Oct 05 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设计模式 php实现命令模式(command)
2015/12/08 PHP
PHP7新特性foreach 修改示例介绍
2016/08/26 PHP
PHP基于接口技术实现简单的多态应用完整实例
2017/04/26 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
php libevent 功能与使用方法详解
2020/03/04 PHP
如何用js控制css中的float的代码
2007/08/16 Javascript
JavaScript的parseInt 取整使用
2011/05/09 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
2013/08/11 Javascript
js switch case default 的用法示例介绍
2013/10/23 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
JS拉起或下载app的实现代码
2017/02/22 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
Python中apply函数的用法实例教程
2014/07/31 Python
利用Python开发微信支付的注意事项
2016/08/19 Python
判断python对象是否可调用的三种方式及其区别详解
2019/01/31 Python
Python列表的切片实例讲解
2019/08/20 Python
Python-openCV开运算实例
2020/07/05 Python
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
Theflamel意大利:女士奢华服装、鞋子和配件
2020/01/11 全球购物
美国家用和厨房电器销售网站:Appliances Connection
2020/01/24 全球购物
生态学毕业生自荐信
2013/10/27 职场文书
优秀信贷员先进事迹
2014/01/31 职场文书
《大海那边》教学反思
2014/04/09 职场文书
爱护花草树木的标语
2014/06/11 职场文书
小学教师读书活动总结
2014/07/08 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
地方课程教学计划
2015/01/19 职场文书
迎新生晚会主持词
2015/06/30 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
导游词之南京汤山温泉
2019/11/26 职场文书
正则表达式基础与常用验证表达式
2022/06/16 Javascript