使用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 相关文章推荐
网上应用的一个不错common.js脚本
Aug 08 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
Sep 21 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
Dec 16 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
Dec 22 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
Aug 30 Javascript
jQuery焦点图左右转换效果
Dec 12 Javascript
echarts饼图扇区添加点击事件的实例
Oct 16 Javascript
angular4 共享服务在多个组件中数据通信的示例
Mar 30 Javascript
基于Vue实现拖拽功能
Jul 29 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
Jun 14 Javascript
全面了解JavaScript的作用域链
Apr 03 Javascript
详解vue中的父子传值双向绑定及数据更新问题
Jun 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
相对路径转化成绝对路径
2007/04/10 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
ExtJS GridPanel 根据条件改变字体颜色
2010/03/08 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
2014/01/06 Javascript
百度移动版的url编码解码示例
2014/04/29 Javascript
jQuery中queue()方法用法实例
2014/12/29 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
JS实现鼠标箭头变成一个燃烧烛光效果的方法
2015/02/28 Javascript
针对JavaScript中this指向的简单理解
2016/08/26 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
详解前后端分离之VueJS前端
2017/05/24 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
ajax请求data遇到的问题分析
2018/01/18 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
高性能web服务器框架Tornado简单实现restful接口及开发实例
2014/07/16 Python
python使用多线程不断刷新网页的方法
2015/03/31 Python
Python中自定义函数的教程
2015/04/27 Python
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
python+selenium实现京东自动登录及秒杀功能
2017/11/18 Python
浅谈Python实现Apriori算法介绍
2017/12/20 Python
python3爬虫获取html内容及各属性值的方法
2018/12/17 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
python 随机森林算法及其优化详解
2019/07/11 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
Python的Lambda函数用法详解
2019/09/03 Python
jupyter notebook oepncv 显示一张图像的实现
2020/04/24 Python
印尼最大的网上书店:Gramedia.com
2018/09/13 全球购物
开办化妆品公司创业计划书
2013/12/26 职场文书
心理健康心得体会
2014/01/02 职场文书
我有一个梦想演讲稿
2014/05/05 职场文书
五心教育心得体会
2014/09/04 职场文书
电子商务实训报告总结
2014/11/05 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书