Geometry

From programming_contest
Revision as of 17:12, 21 April 2016 by imported>Zq8 (polygon centroid)
Jump to navigation Jump to search

polygon area

convex, concave...doesn't matter! still works!

/**
 * polygon area
 * @param x array of x values
 * @param y array of y values
 * @return the area
 */
public double polygonArea( double[] x, double[] y ){
	double a = 0;
	for( int i = 1; i < x.length; i++ ) a += x[i-1]*y[i] - x[i]*y[i-1];
	a += x[x.length-1]*y[0] - x[0]*y[x.length-1];
	a /= 2;
	return Math.abs(a);
}

polygon centroid

center of mass

/**
 * calculates polygon area AND centroid
 * @param x array of x values
 * @param y array of y values
 * @return {area,x coordinate,y coordinate}
 */
public double[] polygonAreaCentroid( double[] x, double[] y ){
	double[] a = new double[3];
	int n = x.length;
	double cross;
	for( int i = 1; n; i++ ){
		cross = x[i-1]*y[i] - x[i]*y[i-1];
		a[0] += cross;
		a[1] += cross*(x[i-1]+x[i]); a[2] += cross*(y[i-1]+y[i]);
	}
	cross = x[n-1]*y[0] - x[0]*y[n-1];
	a[0] += cross;
	a[0] /= 2;
	a[1] += cross*(x[n-1]+x[0]); a[2] += cross*(y[n-1]+y[0]);
	a[1] /= 6*a[0]; a[2] /= 6*a[0];
	if( a[0] < 0 ) a[0] *= -1;
	return a;
}