使用js画图之画切线
样例:http://www.zhaojz.com.cn/demo/draw9.html
//画切线
//point圆外的一点
//dot圆心
//r半径
functiondrawCircleTangent(point,dot,r){
   //画辅助线-start
   varcolor='DarkRed';//切线的颜色
   varcolor2="#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');
   varr_square=Math.pow(r,2);//r的平方
   varpoint_v=point[1]-dot[1];//point到x轴的距离的平方
   varpoint_h=point[0]-dot[0];//point到y轴的距离的平方
   varc_square=Math.pow(point_v,2)+Math.pow(point_h,2);//point到圆心的距离的平方
   varc=Math.sqrt(c_square);//point到圆心的距离
   varsinA=Math.abs(point_v)/c;//sinA
   varcosA=Math.abs(point_h)/c;//cosA
   varb_square=c_square-r_square;//point到切点的距离的平方
   varb=Math.sqrt(b_square);//point到切点的距离
   varsinB=b/c;//sinB
   varcosB=r/c;//cosB
   //以圆心为坐标圆点,确定point所在的象限
   varquadrant =1;//默认值
   varpm_h=point_h==0?point_h:point_h/Math.abs(point_h);//水平方向
   varpm_v=point_v==0?point_v:point_v/Math.abs(point_v);//垂直方向
   varhv=pm_h*pm_v;//相乘,-1时point在一三象限,+1时point在二四象限,0时point在轴上
   switch(hv){
       case1:
           if((pm_h+pm_v)==-2){
               quadrant=2;//第二象限
           }else{
               quadrant=4;//第四象限
           }
           break;
       case-1:
           if((pm_h-pm_v)==-2){
               quadrant=3;//第三象限
           }
           break;
       case0:
           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:
   }
   varsinC=0;
   varconC=0;
   varsinD=0;
   varconD=0;
   switch(quadrant){
       case1:
           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;
       case2:
           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;
       case3:
           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;
       case4:
           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:
   }
   vartangentPointA=[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);
   vartangentPointB=[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);
}
