19
2022
10

两圆相交求交点

求两个圆的交点。

参考:https://blog.csdn.net/Akiyama_sou/article/details/119806236

效果:

获得 Adobe Flash Player


代码:

package  {
	
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import flash.text.TextField;
	
	
	public class Main extends MovieClip {
		
		public var p0: MovieClip;
		public var p1: MovieClip;
		public var p2: MovieClip;
		public var p3: MovieClip;
		public var tf: TextField;
		public function Main() {
			// constructor code
			stage?initStage(null):addEventListener(Event.ADDED_TO_STAGE, initStage);
		}
		
		private function initStage(e:Event):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, initStage);
			
			drag(p0);
			drag(p1);
			drag(p2);
			drag(p3);
			
			addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}
		
		private function enterFrameHandler(e:Event):void 
		{
			graphics.clear();
			graphics.lineStyle(1, 0x0000ff, 1.0);
			graphics.drawCircle(p0.x, p0.y, distance2(p0, p1));
			graphics.lineStyle(1, 0x00ff00, 1.0);
			graphics.drawCircle(p2.x, p2.y, distance2(p2, p3));
			
			
			var r0: Number = distance2(p0, p1);
			var r1: Number = distance2(p2, p3);
			var d: Number = distance2(p0, p2);
			var a: Number = (d * d + r0 * r0 - r1 * r1) / (2 * d);
			if (Math.abs(a) > r0) {
				// 没有交点
				tf.text = "没有交点";
			} else {
				var h: Number = Math.sqrt(r0 * r0 - a * a);
				tf.text = h == 0 ? "一个交点": "两个交点"; // 几乎不会刚好是0
				
				var n1: Point = new Point((p2.x - p0.x) / d, (p2.y - p0.y) / d);
				var n2: Point = new Point( -n1.y, n1.x);
				var p01: Point = new Point(p0.x + a * n1.x + h * n2.x, p0.y + a * n1.y + h * n2.y);
				var p02: Point = new Point(p0.x + a * n1.x - h * n2.x, p0.y + a * n1.y - h * n2.y);
				
				graphics.lineStyle(1.0, 0x000000, 1.0);
				graphics.drawCircle(p01.x, p01.y, 3);
				graphics.drawCircle(p02.x, p02.y, 3);
			}
		}
		
		private function distance2(p0: Object, p1: Object): Number {
			return distance(p0.x - p1.x, p0.y - p1.y);
		}
		
		private function distance(x: Number, y: Number):Number {
			return Math.sqrt(x * x + y * y);
		}
		
		//-----------------------------
		private var curSp:Sprite;
		private var draged:Boolean = false;
		
		private function drag(sp:Sprite):void
		{
			sp.buttonMode = true;
			sp.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
		}
		
		private function mouseDownHandler(e:MouseEvent):void
		{
			curSp = e.currentTarget as Sprite;
			curSp.startDrag();
			addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
			stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
			stage.addEventListener(Event.MOUSE_LEAVE, mouseUpHandler);
		}
		
		private function mouseUpHandler(e:MouseEvent):void
		{
			curSp.stopDrag();
			curSp = null;
			removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
			stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
			stage.removeEventListener(Event.MOUSE_LEAVE, mouseUpHandler);
		}
		
		private function mouseMoveHandler(e:MouseEvent):void
		{
			//
			draged = true;
		}
	}
	
	
}

源码打包下载

« 上一篇下一篇 »

相关文章:

线段与椭圆的交点  (2017-1-6 14:43:41)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。