使用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 相关文章推荐
javascript 写类方式之六
Jul 05 Javascript
JavaScript 学习初步 入门教程
Mar 25 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
Oct 13 Javascript
自制轻量级仿jQuery.boxy对话框插件代码
Oct 26 Javascript
Javascript字符串对象的常用方法简明版
Jun 26 Javascript
Underscore源码分析
Dec 30 Javascript
Vue.js第三天学习笔记(计算属性computed)
Dec 01 Javascript
jQuery滚动监听实现商城楼梯式导航效果
Mar 06 Javascript
vue中 数字相加为字串转化为数值的例子
Nov 07 Javascript
javascript实现商品图片放大镜
Nov 28 Javascript
vue 验证两次输入的密码是否一致的方法示例
Sep 29 Javascript
js 实现Material UI点击涟漪效果示例
Sep 23 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实现简单洗牌算法
2013/06/18 PHP
PHP中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
简单谈谈php浮点数精确运算
2016/03/10 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
PHP常见加密函数用法示例【crypt与md5】
2019/01/27 PHP
Javascript注入技巧
2007/06/22 Javascript
javascript测试题练习代码
2012/10/10 Javascript
jquery创建表格(自动增加表格)代码分享
2013/12/25 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
jQuery实现单击和鼠标感应事件
2015/02/01 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
jQuery qrcode生成二维码的方法
2016/04/03 Javascript
AngularJS中的表单简单入门
2016/07/28 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
js使用swiper实现层叠轮播效果实例代码
2018/12/12 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
2019/01/30 Javascript
小程序实现上下切换位置
2020/11/16 Javascript
[02:27]2014DOTA2国际邀请赛 VG赛后采访:更大的挑战在等着我们
2014/07/13 DOTA
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
Python3.5面向对象编程图文与实例详解
2019/04/24 Python
详解numpy.meshgrid()方法使用
2019/08/01 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
python学习笔记之多进程
2020/08/06 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
python自动打开浏览器下载zip并提取内容写入excel
2021/01/04 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
幼儿园保教管理制度
2014/02/03 职场文书
幼儿园运动会入场词
2014/02/10 职场文书
团日活动总结
2014/04/28 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
作风建设年度心得体会
2014/10/29 职场文书
华山导游词
2015/02/03 职场文书
2015年度校学生会工作总结报告
2015/05/23 职场文书
详解CocosCreator消息分发机制
2021/04/16 Javascript
Mysql 如何合理地统计一个数据库里的所有表的数据量
2022/04/18 MySQL