样例: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);
}

JS画几何图形之五【过圆外一点作切线】的更多相关文章

  1. JS画几何图形之六【过直线外一点作垂线】

    样例:http://www.zhaojz.com.cn/demo/draw10.html 依赖:[点].[直线] //过直线外一点画垂线 function drawVerticalLine(point ...

  2. JS画几何图形之二【圆】

    半径为r的圆上的点p(x,y)与圆心O(x0,y0)的关系: x = x0+rcosA;  y = y0+rsinA ,A为弧度 样例:http://www.zhaojz.com.cn/demo/dr ...

  3. JS画几何图形之四【饼图】

    饼图是将一个圆分割为多个扇形. 样例:http://www.zhaojz.com.cn/demo/draw8.html 依赖:[扇形] //饼图 //dot 圆点 //r 半径 //data 数据(一 ...

  4. JS画几何图形之三【正弦曲线】

    数学式:y=Asin(ωx+φ)+k 样例:http://www.zhaojz.com.cn/demo/draw7.html 依赖:[点].[直线] JS函数的声明: //画正弦曲线 //dot 原点 ...

  5. JS画几何图形之一【直线】

    JS画图的想法经过大脑的时候,觉得有点意思,所以就实践了一番.JS画图为系列文章,本是讲点.线和面 先看样例:http://www.zhaojz.com.cn/demo/draw5.html 一.点 ...

  6. MT【45】抛物线外一点作抛物线的切线(尺规作图题)

    注1:S为抛物线焦点 注2:由切线的唯一性,以及切线时可以利用MT[42]评得到三角形全等从而得到切线平分$\angle MQS$得到

  7. 用JS画斐波那契螺旋线(黄金螺旋线)

    偶然看到斐波那契螺旋线(黄金螺旋线)的定义及画图方法,试着用JS画了一下,很漂亮,很好玩 具体定义及画法大家查一下就有了,很简单. 以下是代码: <!DOCTYPE html> <h ...

  8. Arcgis for js开发之直线、圆、箭头、多边形、集结地等绘制方法

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

  9. js画一棵树

    用纯js画一棵树.思路: 1.一棵树的图片,作为页面背景: 2.通过html5中的canvas画布进行遮罩: 3.定时每隔10ms,从下往上清除1px的遮罩: <!DOCTYPE html> ...

随机推荐

  1. Nvidia TX2 Robot 环境配置记录

    p.p1 { margin: 0.0px 0.0px 2.0px 0.0px; font: 14.0px "Helvetica Neue"; color: #454545 } p. ...

  2. Bootstrap里的文件分别表示什么?都有什么用?

    bootstrap.css 是完整的bootstrap样式表,未经压缩过的,可供开发的时候进行调试用bootstrap.min.css 是经过压缩后的bootstrap样式表,内容和bootstrap ...

  3. Nginx简介与安装

    | 简介 Nginx是一个高性能的HTTP和反向代理服务器,可以作为负载均衡服务器,也是一个IMAP/POP3/SMTP服务器.它的特点是占有内存少,并发能力强.目前有很多大型公司都在使用Nginx, ...

  4. APP加固技术历程及未来级别方案:虚机源码保护

    传统App加固技术,前后经历了四代技术变更,保护级别每一代都有所提升,但其固有的安全缺陷和兼容性问题始终未能得到解决.而下一代加固技术-虚机源码保护,适用代码类型更广泛,App保护级别更高,兼容性更强 ...

  5. ES6这些就够了

    刚开始用vue或者react,很多时候我们都会把ES6这个大兄弟加入我们的技术栈中.但是ES6那么多那么多特性,我们需要全部都掌握吗?秉着二八原则,掌握好常用的,有用的这个可以让我们快速起飞. 接下来 ...

  6. java 之 抽象工厂模式(大话设计模式)

    看了几次抽象工厂模式,每次查看都需要重新理解一次,可能是涉及的类和接口比较多,所以比较难缕清的关系吧!在笔者看来,我们还是要吸取其思想而不是生搬硬套. 来看下类图: 大话设计模式-类图 看类图已经很乱 ...

  7. Cesium基础使用介绍

    前言 最近折腾了一下三维地球,本文简单为大家介绍一款开源的三维地球软件--Cesium,以及如何快速上手Cesium.当然三维地球重要的肯定不是数据显示,这只是数据可视化的一小部分,重要的应该是背后的 ...

  8. sql执行时间过长,请高手指点!

    需求:查询出每一位"社工员"通过23门社工课进度100%的数量和23门社工课对应的考试通过的数量. 业务解析: 1.社工员--针对特定学员的一批人.在表USERS_SW_REGIS ...

  9. 基于TCP协议的socket编程

    什么是socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面, ...

  10. Spring Cloud Zuul

    新建Spring Boot工程,命名为zuul 1.pom.xml添加依赖 <?xml version="1.0" encoding="UTF-8"?&g ...