zoukankan      html  css  js  c++  java
  • 判断点是否在直线上或线段上 判断线段相交 点与多边形的位置关系

    package
    {
    	import flash.display.Sprite;
    	import flash.geom.Point;
    	
    	public class Arr extends Sprite
    	{
    
    		private const INFINITY:Number = 1e10;
    		private const ESP:Number = 1e-5;;
    		private const MAX_N:int = 1000;
    		private var Polygon:Array=new Array;
    		
    		public function Arr()
    		{
    			var p0:Point = new Point(120,150);
    			var p1:Point = new Point(120,130);
    			var p2:Point = new Point(130,130);
    			var p3:Point = new Point(130,120);
    			var p4:Point = new Point(120,120);
    			var p5:Point = new Point(120,110);
    			var p6:Point = new Point(130,110);
    			var p7:Point = new Point(130,100);
    			var p8:Point = new Point(150,100);
    			var p9:Point = new Point(150,80);
    			var p10:Point = new Point(120,80);
    			var p11:Point = new Point(120,0);
    			var p12:Point = new Point(100,0);
    			var p13:Point = new Point(100,100);
    			var p14:Point = new Point(0,100);
    			var p15:Point = new Point(0, 150);
    			
    			var s:Sprite = new Sprite  ;
    			addChild(s);
    			s.graphics.lineStyle(1);
    			s.graphics.moveTo(p0.x,p0.y);
    			s.graphics.lineTo(p1.x,p1.y);
    			s.graphics.lineTo(p2.x,p2.y);
    			s.graphics.lineTo(p3.x,p3.y);
    			s.graphics.lineTo(p4.x,p4.y);
    			s.graphics.lineTo(p5.x,p5.y);
    			s.graphics.lineTo(p6.x,p6.y);
    			s.graphics.lineTo(p7.x,p7.y);
    			s.graphics.lineTo(p8.x,p8.y);
    			s.graphics.lineTo(p9.x,p9.y);
    			s.graphics.lineTo(p10.x,p10.y);
    			s.graphics.lineTo(p11.x,p11.y);
    			s.graphics.lineTo(p12.x,p12.y);
    			s.graphics.lineTo(p13.x,p13.y);
    			s.graphics.lineTo(p14.x,p14.y);
    			s.graphics.lineTo(p15.x,p15.y);
    			s.graphics.lineTo(p0.x,p0.y);
    
    			
    			Polygon.push(p0);
    			Polygon.push(p1);
    			Polygon.push(p2);
    			Polygon.push(p3);
    			Polygon.push(p4);
    			Polygon.push(p5);
    			Polygon.push(p6);
    			Polygon.push(p7);
    			Polygon.push(p8);
    			Polygon.push(p9);
    			Polygon.push(p10);
    			Polygon.push(p11);
    			Polygon.push(p12);
    			Polygon.push(p13);
    			Polygon.push(p14);
    			Polygon.push(p15);
    			
    			var X:int = 120;
    			var Y:int = 130;
    			/*var X:int = 130;
    			var Y:int = 165;*/
    			/*var X:int = 130;
    			var Y:int = 145;*/
    			/*var X:int = 120;
    			var Y:int = 100;*/
    			/*var X:int = 110;
    			var Y:int = 100;*/
    			/*var X:int = 120;
    			var Y:int = 125;*/
    			/*var X:int = 90;
    			var Y:int = 125;*/
    			//var X:int = 120;
    			//var Y:int = 185;
    			/*var X:int = 130;
    			var Y:int = 125;*/
    			/*var X:int = 120;
    			var Y:int = 200;*/
    			var checkpoint:Point = new Point(X, Y);
    			var s1:Sprite = new Sprite  ;
    			addChild(s1);
    			s1.graphics.beginFill(0xff00ff,1);
    			s1.graphics.drawCircle(X,Y,2);
    			s1.graphics.endFill();
    
    			var m:int = InPolygon(Polygon,checkpoint);
    			trace("========="+m);
    		}
    		// 计算叉乘 |P0P1| × |P0P2|
    		public function Multiply(p1:Point,p2:Point,p0:Point):Number
    		{
    			return ((p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y));
    		}
    		// 判断线段是否包含点point
    		private function IsOnline(point:Point,line:LineSegment):Boolean
    		{
    			return( ( Math.abs(Multiply(line.pt1, line.pt2, point)) < ESP ) &&
    			( ( point.x - line.pt1.x ) * ( point.x - line.pt2.x ) <= 0 ) &&
    			( ( point.y - line.pt1.y ) * ( point.y - line.pt2.y ) <= 0 ) );
    		}
    		// 判断线段相交
    		private  function Intersect(L1:LineSegment,L2:LineSegment):Boolean
    		{
    			return((Math.max(L1.pt1.x, L1.pt2.x) >= Math.min(L2.pt1.x, L2.pt2.x)) &&
    			(Math.max(L2.pt1.x, L2.pt2.x) >= Math.min(L1.pt1.x, L1.pt2.x)) &&
    			(Math.max(L1.pt1.y, L1.pt2.y) >= Math.min(L2.pt1.y, L2.pt2.y)) &&
    			(Math.max(L2.pt1.y, L2.pt2.y) >= Math.min(L1.pt1.y, L1.pt2.y)) &&
    			(Multiply(L2.pt1, L1.pt2, L1.pt1) * Multiply(L1.pt2, L2.pt2, L1.pt1) >= 0) &&
    			(Multiply(L1.pt1, L2.pt2, L2.pt1) * Multiply(L2.pt2, L1.pt2, L2.pt1) >= 0)
    			);
    		}
        //线段pp1与数组arr组成的线段是否相交
    		public function segmentIntersect(arr:Array,p:Point,p1:Point):LineSegment
    		{
    			var n:int = arr.length;
    			var line:LineSegment = new LineSegment();
    		   
    			line.pt1 = p;
    			line.pt2 = p1;
    			//排除数组最后一点和第一点组成线段i<n-1就行了
    			for (var i:int = 0; i < n; i++ ) 
    			{
    				var side:LineSegment = new LineSegment();
    
    				side.pt1 = arr[i];
    				side.pt2 = arr[(i + 1) % n];
    				
    				if ( Intersect(side,line) ) 
    				{
    					//trace("----相交了----");
    					return side;
    				}
    			}
    			return null;
    		}  		
    		/* 
    		 * 射线法判断点q与多边形polygon的位置关系,
    		 * 要求polygon为简单多边形,
    		 * 顶点逆时针排列如果点在多边形内:返回1
    		 * 如果点在多边形边上:返回0
    		 * 如果点在多边形外:返回-1
    		 */
    		public function InPolygon(polygon:Array,point:Point):int
    		{
    			var n:int = polygon.length;
    			var count:int = 0;
    			var line:LineSegment = new LineSegment();
    		   
    			line.pt1 = point;
    			line.pt2.y = point.y;
    			line.pt2.x = - INFINITY;
    			for (var i:int = 0; i < n; i++ ) 
    			{
    				// 得到多边形的一条边
    				var side:LineSegment = new LineSegment();
    				side.pt1 = polygon[i];
    				side.pt2 = polygon[(i + 1) % n];
    				if (IsOnline(point, side)) 
    				{
    					trace("在多边形上");
    					return 0 ;
    				}
    				// 如果side平行x轴则不作考虑
    				if ( Math.abs(side.pt1.y - side.pt2.y) < ESP )
    				{
    					continue;
    				}
    				if ( IsOnline(side.pt1, line) ) 
    				{
    					if( side.pt1.y > side.pt2.y )
    					{
    						count++;
    					}
    				} 
    				else if ( IsOnline(side.pt2, line) ) 
    				{
    					if( side.pt2.y > side.pt1.y )
    					{ 
    						count++;
    					}
    				} 
    				else if ( Intersect(line, side) ) 
    				{
    					count++;
    				}
    			}
    			if ( count % 2 == 1 ) 
    			{
    				trace("在多边形内");
    				return 1;
    			}
    			else 
    			{
    				trace("在多边形外");
    				return -1;
    			}
    		}
    	}
    }
    
    	import flash.geom.Point;
    	class LineSegment
    	{
        	public var pt1:Point;
        	public var pt2:Point;
        	public function LineSegment()
        	{
        		this.pt1 = new Point();
        		this.pt2 = new Point();
        	}
    	}
    
    
    
  • 相关阅读:
    java.util.concurrent.atomic 包详解
    SpringBoot RESTful 应用中的异常处理小结
    Spring 核心框架体系结构
    Java 的静态代理 动态代理(JDK和cglib)
    Spring5:@Autowired注解、@Resource注解和@Service注解
    offsetWidth/offsetHeight,clientWidth/clientHeight与scrollWidth/scrollHeight的区别
    一个小技能
    在chrome console添加jQuery支持
    如和判断两个浮点数是否相等
    Object.create() vs new SomeFunction() in javascript
  • 原文地址:https://www.cnblogs.com/602147629/p/2005294.html
Copyright © 2011-2022 走看看