本站原创文章,转载请注明: 转载自zrong's Blog,原文 获取任意位置与圆的切点的坐标,欢迎使用文章源码进行转载。
本站转载文章会标明[转],转载请注明原始作者文章地址。
刚刚发的那个“获取任意位置与圆直径形成的等腰三角形的底边与圆的交点的坐标”其实没有多大用处,而这个用处就大了,可以在游戏中进行碰撞检测,在碰到圆形障碍物的时候求出最短的运行路径。
原理图
运行效果
源码
?Download SimpleSample6.as
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | /** * 计算鼠标位置与圆的切点坐标 * */ package { import flash.display.Sprite; import flash.events.MouseEvent; [SWF(width=400,height=400)] public class SimpleSample6 extends Sprite { private var _centerX:Number; private var _centerY:Number; private var _radius:Number = 80; public function SimpleSample6() { _centerX = stage.stageWidth/2; _centerY = stage.stageHeight/2; draw(); drawTriangle(0, 0); stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); } private function draw():void { graphics.clear(); graphics.lineStyle(1); graphics.moveTo(0, stage.stageHeight/2); graphics.lineTo(stage.stageWidth, _centerY); graphics.moveTo(_centerX, 0); graphics.lineTo(_centerX, stage.stageHeight); graphics.drawCircle(_centerX, _centerY, _radius); } private function drawTriangle($mouseX:Number, $mouseY:Number):void { var __dx:Number = _centerX - $mouseX; var __dy:Number = _centerY - $mouseY; //计算点击处与圆心相对于X轴的夹角 var __r1:Number = Math.atan2(__dy, __dx); //计算点击处与圆心、点击处与切点1这两条线段间的夹角 var __d1:Number = Math.sqrt(__dx*__dx + __dy*__dy); var __r2:Number = Math.asin(_radius/__d1); //计算从切点1向圆的垂直直径做垂线形成的直角三角形的一个角 var __r3:Number = __r1 - __r2; //计算坐标系中的角度 var __r4:Number = __r3 - Math.PI/2; //计算切点1相对于圆心的x、y坐标 var __x1:Number = _radius * Math.cos(__r4); var __y1:Number = _radius * Math.sin(__r4); //计算点击处与切线2相对于X轴的夹角 var __r5:Number = Math.PI/2 - __r1 - __r2; //计算坐标系中的角度 var __r6:Number = -__r5; //计算切点2相对于圆心的x、y坐标 var __x2:Number = _radius * Math.cos(__r6); var __y2:Number = _radius * Math.sin(__r6); graphics.moveTo(_centerX, _centerY); graphics.lineTo($mouseX, $mouseY); graphics.lineTo(_centerX+__x1, _centerY+__y1); graphics.lineTo(_centerX, _centerY); graphics.lineTo(_centerX-__x2, _centerY-__y2); graphics.lineTo($mouseX, $mouseY); } private function mouseMoveHandler(evt:MouseEvent):void { draw(); drawTriangle(mouseX, mouseY); } } } |




最新评论