多边形面积计算

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




 
原文地址:https://www.cnblogs.com/602147629/p/2005842.html