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();
}
}