使用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); }