使用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 相关文章推荐
Prototype使用指南之ajax
Jan 10 Javascript
Javascript 获取字符串字节数的多种方法
Jun 02 Javascript
JavaScript 用cloneNode方法克隆节点的代码
Oct 15 Javascript
js关闭模态窗口刷新父页面或跳转页面
Dec 13 Javascript
JavaScript实现Flash炫光波动特效
May 14 Javascript
javascript背景时钟实现方法
Jun 18 Javascript
jquery的幻灯片图片切换效果代码分享
Sep 07 Javascript
jQuery实现的购物车物品数量加减功能代码
Nov 16 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
Jan 24 Javascript
javascript 代码是如何被压缩的示例代码
May 06 Javascript
浅谈vue的第一个commit分析
Jun 08 Javascript
Vue自定义铃声提示音组件的实现
Jan 22 Vue.js
使用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详解ASCII码对照表与字符转换
2011/12/05 PHP
浅析PHP中Collection 类的设计
2013/06/21 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
laravel 多图上传及图片的存储例子
2019/10/14 PHP
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
2015/04/02 Javascript
详解Nodejs的timers模块
2016/12/22 NodeJs
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
Angular 4环境准备与Angular cli创建项目详解
2017/05/27 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
2018/01/10 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
基于canvas实现手写签名(vue)
2020/05/21 Javascript
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
python实现跨文件全局变量的方法
2014/07/07 Python
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
Python 模拟登陆的两种实现方法
2017/08/10 Python
Python多进程multiprocessing.Pool类详解
2018/04/27 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
python单线程下实现多个socket并发过程详解
2019/07/27 Python
在pycharm中配置Anaconda以及pip源配置详解
2019/09/09 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
python ftplib模块使用代码实例
2019/12/31 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
Django model重写save方法及update踩坑详解
2020/07/27 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
马来西亚太阳镜、眼镜和隐形眼镜网上商店:Focus Point
2018/12/13 全球购物
2014流动人口计划生育工作总结
2014/12/20 职场文书
工作表扬信范文
2015/01/17 职场文书
中班教师个人总结
2015/02/05 职场文书
婚宴新郎致辞
2015/07/28 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书