import flash.geom.Point;
import flash.display.Sprite;
/*
A(x1,y1)、B(x2,y2)、C(x3,y3)三点的面积公式为
|x1 x2 x3|
S(A,B,C) = |y1 y2 y3| * 0.5 = [(x1-x3)*(y2-y3) - (x2-x3)*(y1-y3)]*0.5 ;(当三点为逆时针时为正,顺时针则为负的)
|1 1 1 |
//S(A,B,C) = Math.abs((x1-x3)*(y2-y3)-(x2-x3)*(y1-y3))*0.5 ;
对多边形A1A2A3、、、An(顺或逆时针都可以),设平面上有任意的一点P,则有:
S(A1,A2,A3,、、、,An) = abs(S(P,A1,A2) + S(P,A2,A3)+、、、+S(P,An,A1))
P是可以取任意的一点,用(0,0)时就是下面的了:
设点顺序 (x1 y1) (x2 y2) ... (xn yn)
则面积等于
|x1 y1 | |x2 y2| |x(n-1) y(n-1)| |xn yn|
Math.abs( | | + | | + ...... + | | + | | )*0.5
|x2 y2 | |x3 y3| |xn yn | |x1 y1|
其中
|x1 y1|
| |=x1*y2-y1*x2
|x2 y2|
|x2 y2|
| |=x2*y3-y2*x3
|x3 y3|
|x(n-1) y(n-1)|
| |=x(n-1)*yn-y(n-1)*xn
|xn yn |
|xn yn|
| |=xn*y1-yn*x1
|x1 y1|
因此面积公式展开为:
|x1 y1| |x2 y2| |x(n-1) y(n-1)| |xn yn|
Math.abs(| | + | |+ ... + | | + | | )*0.5=Math.abs((x1*y2-y1*x2)+(x2*y3-y2*x3)+...+(x(n-1)*yn-y(n-1)*xn)+(xn*y1-yn*x1))*0.5;
|x2 y2| |x3 y3| |xn yn | |x1 y1|
//Math.abs((x1*y2-y1*x2)+(x2*y3-y2*x3)+...+(x(n-1)*yn-y(n-1)*xn)+(xn*y1-yn*x1))*0.5;
*/
var pt:Point = new Point(0,0);
var pt1:Point = new Point(10,10);
var pt2:Point = new Point(10,60);
var pt3:Point = new Point(60,60);
var pt4:Point = new Point(60,80);
var pt5:Point = new Point(10,80);
var pt6:Point = new Point(10,110);
var pt7:Point = new Point(110,110);
var pt8:Point = new Point(110,60);
var pt9:Point = new Point(160,60);
var pt10:Point = new Point(160,10);
var s:Sprite = new Sprite ;
addChild(s);
s.graphics.lineStyle(1,0xff0000);
s.graphics.moveTo(pt1.x,pt1.y);
s.graphics.lineTo(pt2.x,pt2.y);
s.graphics.lineTo(pt3.x,pt3.y);
s.graphics.lineTo(pt4.x,pt4.y);
s.graphics.lineTo(pt5.x,pt5.y);
s.graphics.lineTo(pt6.x,pt6.y);
s.graphics.lineTo(pt7.x,pt7.y);
s.graphics.lineTo(pt8.x,pt8.y);
s.graphics.lineTo(pt9.x,pt9.y);
s.graphics.lineTo(pt10.x,pt10.y);
s.graphics.lineTo(pt1.x,pt1.y);
function Matrix3Pt(pt1:Point,pt2:Point,pt3:Point,pt4:Point,pt5:Point,pt6:Point,pt7:Point,pt8:Point,pt9:Point,pt10:Point):Number
{
//Math.abs((x1*y2-y1*x2)+(x2*y3-y2*x3)+...+(x(n-1)*yn-y(n-1)*xn)+(xn*y1-yn*x1))*0.5;
var area:Number =Math.abs(
(pt1.x*pt2.y-pt1.y*pt2.x)
+(pt2.x*pt3.y-pt2.y*pt3.x)
+(pt3.x*pt4.y-pt3.y*pt4.x)
+(pt4.x*pt5.y-pt4.y*pt5.x)
+(pt5.x*pt6.y-pt5.y*pt6.x)
+(pt6.x*pt7.y-pt6.y*pt7.x)
+(pt7.x*pt8.y-pt7.y*pt8.x)
+(pt8.x*pt9.y-pt8.y*pt9.x)
+(pt9.x*pt10.y-pt9.y*pt10.x)
+(pt10.x*pt1.y-pt10.y*pt1.x)
)*0.5;
return area;
}
trace(Matrix3Pt(pt1,pt2,pt3,pt4,pt5,pt6,pt7,pt8,pt9,pt10));
import flash.geom.Point;
import flash.display.Sprite;
var pt0:Point = new Point(10,10);
var pt1:Point = new Point(10,60);
var pt2:Point = new Point(60,60);
var pt3:Point = new Point(60,80);
var pt4:Point = new Point(10,80);
var pt5:Point = new Point(10,110);
var pt6:Point = new Point(110,110);
var pt7:Point = new Point(110,60);
var pt8:Point = new Point(160,60);
var pt9:Point = new Point(160,10);
var s:Sprite = new Sprite ;
addChild(s);
s.graphics.lineStyle(1,0xff0000);
s.graphics.moveTo(pt0.x,pt0.y);
s.graphics.lineTo(pt1.x,pt1.y);
s.graphics.lineTo(pt2.x,pt2.y);
s.graphics.lineTo(pt3.x,pt3.y);
s.graphics.lineTo(pt4.x,pt4.y);
s.graphics.lineTo(pt5.x,pt5.y);
s.graphics.lineTo(pt6.x,pt6.y);
s.graphics.lineTo(pt7.x,pt7.y);
s.graphics.lineTo(pt8.x,pt8.y);
s.graphics.lineTo(pt9.x,pt9.y);
s.graphics.lineTo(pt0.x,pt0.y);
var arr:Array = new Array ;
arr.push(pt0);
arr.push(pt1);
arr.push(pt2);
arr.push(pt3);
arr.push(pt4);
arr.push(pt5);
arr.push(pt6);
arr.push(pt7);
arr.push(pt8);
arr.push(pt9);
var count:uint = 0;
trace(polygonArea(arr));
function polygonArea(arr:Array):Number
{
var i:uint = 0;
var area:Number = 0;
var len:uint = arr.length;
for (i = 0; i < len; i+=2)
{
if ((i+2)<len)
{
area += Matrix3Pt(arr[i],arr[i + 1],arr[i + 2]);
}
else
{
area += Matrix3Pt(arr[i],arr[i + 1],arr[0]);
}
}
//此处注意Math.abs和乘以0.5要在加完之后执行
return Math.abs(area)*0.5;
}
function Matrix3Pt(pt1:Point,pt2:Point,pt3:Point):Number
{
var area:Number =(pt1.x*pt2.y-pt1.y*pt2.x)+(pt2.x*pt3.y-pt2.y*pt3.x);
return area;
}