使用js画图之画切线


Posted in Javascript onJanuary 12, 2015

样例:http://www.zhaojz.com.cn/demo/draw9.html

//画切线

//point 圆外的一点

//dot 圆心

//r 半径

function drawCircleTangent(point, dot, r){

    //画辅助线-start

    var color = 'DarkRed'; //切线的颜色

    var color2 = "#ccc"; //其它辅助线的颜色

    drawLine(dot, [dot[0]+9*r,dot[1]], {color: color2}); // 延长圆心所在的水平线

    drawLine(dot, [dot[0],dot[1]-4*r], {color: color2}); // 画出圆心所在的垂直线

    drawPoint({

        pw:2,ph:2,color:'DarkRed',point: [dot[0]+9*r,dot[1],'x']

    });

    drawPoint({

        pw:2,ph:2,color:'DarkRed',point: [dot[0],dot[1]-4*r,'y']

    });

    drawLine(point, [point[0],dot[1]], {color: color2}); // 画point到x轴的垂直线

    drawLine(point, dot, {color: color2}); // 连接point与dot

    drawLine([point[0]-2*r, point[1]], [point[0]+2*r, point[1]], {color: color2}); //画point所在的水平线

    //画辅助线-end

    //point.push('point');

    drawPoint({

        pw:2,ph:2,color:'DarkRed',point: point

    });

    //dot.push('centre');

    var r_square = Math.pow(r,2); // r的平方

    var point_v = point[1]-dot[1]; //point到x轴的距离的平方

    var point_h = point[0]-dot[0]; //point到y轴的距离的平方

    var c_square = Math.pow(point_v,2) + Math.pow(point_h,2); //point到圆心的距离的平方

    var c = Math.sqrt(c_square); //point到圆心的距离

    var sinA = Math.abs(point_v)/c; //sinA

    var cosA = Math.abs(point_h)/c; //cosA

    var b_square = c_square-r_square; //point到切点的距离的平方

    var b = Math.sqrt(b_square); //point到切点的距离

    var sinB = b/c; //sinB

    var cosB = r/c; //cosB

    //以圆心为坐标圆点,确定point所在的象限

    var quadrant  = 1; //默认值

    var pm_h = point_h == 0? point_h: point_h/Math.abs(point_h); //水平方向

    var pm_v = point_v == 0? point_v: point_v/Math.abs(point_v); //垂直方向

    var hv = pm_h*pm_v; //相乘,-1时point在一三象限,+1时point在二四象限,0时point在轴上

    switch(hv){

        case 1:

            if((pm_h+pm_v)==-2){ 

                quadrant = 2; //第二象限

            }else{

                quadrant = 4; //第四象限

            }

            break;

        case -1:

            if((pm_h-pm_v)==-2){

                quadrant = 3; //第三象限

            }

            break;

        case 0:

            if((pm_h+pm_v)==-1){ //point在x轴的负半轴或者y轴的正半轴时,断定point在第二象限

                quadrant = 2;

            }

            if((pm_h+pm_v)==1){ //point在x轴的正半轴或者y轴的负半轴时,断定point在第四象限

                quadrant = 4;

            }

            break;

        default:

    }

    var sinC = 0;

    var conC = 0;

    var sinD = 0;

    var conD = 0;

    switch(quadrant){

        case 1:

            sinC = cosB*cosA+sinB*sinA; //sinC = sin(90+(B-A)) = cos(B-A) = cosB*cosA+sinB*sinA

            conC = -(sinB*cosA-cosB*sinA); //cosC = cos(90+(B-A)) = -sin(B-A) = -(sinB*cosA-cosB*sinA)

            sinD = -(cosA*cosB-sinA*sinB); //sinD = sin(270-(A+B))

            conD = -(sinA*cosB+cosA*sinB); //conD = cos(270-(A+B))

            break;

        case 2:

            sinC = -(cosB*cosA-sinB*sinA); //sinC = sin(-90+(A+B))

            conC = sinA*cosB+cosA*sinB; //conC = cos(-90+(A+B))

            sinD = cosA*cosB+sinA*sinB; //sinD = sin(90+(A-B))

            conD = -(sinA*cosB-cosA*sinB); //conD = cos(90+(A-B))

            break;

        case 3:

            sinC = -(cosA*cosB+sinA*sinB); //sinC = sin(-90+(A-B))

            conC = -(sinA*cosB-cosA*sinB); //conC = cos(-90+(A-B))

            sinD = (cosA*cosB-sinA*sinB);  

            conD = sinA*cosB+cosA*sinB;

            break;

        case 4:

            sinC = cosA*cosB-sinA*sinB;

            conC = -(sinA*cosB+cosA*sinB)

            sinD = -(cosA*cosB+sinA*sinB); //sinD = sin(270+(A-B))

            conD = (sinA*cosB-cosA*sinB); //conD = cos(270+(A-B))

            break;

        default:

    }

    var tangentPointA = [point[0]+b*conC, point[1]+b*sinC]; //切点A位置

    drawLine(point, tangentPointA, {color: color}); //画出切线

    drawLine(dot, tangentPointA, {color: color2}); //连接圆点与切点

    //drawArc(point, 17, (quadrant ==1 ||quadrant==4?180:0)-(quadrant ==2 ||quadrant==3?(-1):1)*Math.asin(sinC)*180/Math.PI, 0);

    var tangentPointB = [point[0]+b*conD, point[1]+b*sinD]; //切点B位置

    drawLine(point, tangentPointB, {color: color}); //画出切线

    drawLine(dot, tangentPointB, {color: color2}); //连接圆点与切点

    //drawArc(point, 27, (quadrant ==1 ||quadrant==4?180:0)-(quadrant ==2 ||quadrant==3?(-1):1)*Math.asin(sinD)*180/Math.PI, 0);

    drawPoint({ //描切点

        pw:3,ph:3,color:'DarkRed',point: tangentPointA

    });

    drawPoint({ //描切点

        pw:3,ph:3,color:'DarkRed',point: tangentPointB

    });

    //画辅助弧

    //(quadrant ==1 ||quadrant==4?360:0)

    drawArc(point, b, 60, (quadrant ==1 ||quadrant==4?180:0)-(quadrant ==2 ||quadrant==3?(-1):1)*Math.asin(sinC)*180/Math.PI-5);

}
Javascript 相关文章推荐
基于jquery的bankInput银行卡账号格式化
Aug 22 Javascript
Jquery Uploadify上传带进度条的简单实例
Feb 12 Javascript
javascript实现unicode与ASCII相互转换的方法
Dec 10 Javascript
jquery读写cookie操作实例分析
Dec 24 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
Sep 28 Javascript
如何快速上手Vuex
Feb 14 Javascript
Vue.js如何优雅的进行form validation
Apr 07 Javascript
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
May 17 Javascript
vue.js国际化 vue-i18n插件的使用详解
Jul 07 Javascript
web前端vue实现插值文本和输出原始html
Jan 19 Javascript
Bootstrap Table中的多选框删除功能
Jul 15 Javascript
JavaScript数组方法的错误使用例子
Sep 13 Javascript
使用js画图之饼图
Jan 12 #Javascript
javacript使用break内层跳出外层循环分析
Jan 12 #Javascript
使用js画图之正弦曲线
Jan 12 #Javascript
使用js画图之圆、弧、扇形
Jan 12 #Javascript
js函数与php函数的区别实例浅析
Jan 12 #Javascript
使用JS画图之点、线、面
Jan 12 #Javascript
javascript定义变量时带var与不带var的区别分析
Jan 12 #Javascript
You might like
一个简单的PHP&MYSQL留言板源码
2020/07/19 PHP
php木马攻击防御之道
2008/03/24 PHP
11款新鲜的jQuery插件[附所有demo下载]
2011/01/24 Javascript
通过JS获取用户本地图片路径并显示的代码
2012/02/16 Javascript
JQuery入门——事件切换之toggle()方法应用介绍
2013/02/05 Javascript
jquery遍历select元素(实例讲解)
2013/12/31 Javascript
node.js中使用socket.io制作命名空间
2014/12/15 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
2015/04/06 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
JavaScript 函数的执行过程
2016/05/09 Javascript
异步加载JS、CSS代码(推荐)
2016/06/15 Javascript
JQuery.validationEngine表单验证插件(推荐)
2016/12/10 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
js oncontextmenu事件使用详解
2017/03/25 Javascript
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
详解js跨域请求的两种方式,支持post请求
2018/05/05 Javascript
VSCode使用之Vue工程配置eslint
2019/04/30 Javascript
JS Math对象与Math方法实例小结
2019/07/05 Javascript
JS实现水平遍历和嵌套递归操作示例
2019/08/15 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
Javascript 关于基本类型和引用类型的个人理解
2019/11/01 Javascript
处理JavaScript值为undefined的7个小技巧
2020/07/28 Javascript
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
Python多线程同步---文件读写控制方法
2019/02/12 Python
关于Pytorch MaxUnpool2d中size操作方式
2020/01/03 Python
python help函数实例用法
2020/12/06 Python
美国最顶级的精品店之一:Hampden Clothing
2016/12/22 全球购物
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
后备干部培训方案
2014/05/22 职场文书
励志演讲稿200字
2014/08/21 职场文书
社区灵活就业证明
2014/11/03 职场文书
专项资金申请报告
2015/05/15 职场文书
使用MybatisPlus打印sql语句
2022/04/22 SQL Server