/*
* Copyright (C) 2011-2015, Peter Abeles. All Rights Reserved.
*
* This file is part of Geometric Regression Library (GeoRegression).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package georegression.geometry;
import georegression.struct.point.Point2D_I32;
import georegression.struct.shapes.Polygon2D_I32;
import georegression.struct.shapes.Rectangle2D_I32;
import java.util.List;
/**
* Various functions related to polygons.
*
* @author Peter Abeles
*/
public class UtilPolygons2D_I32 {
/**
* Finds the minimum area bounding rectangle which is aligned to the x and y axis around the list of points.
* Note (x0,y0) is inclusive and (x1,y1) is exclusive.
*
* @param points (Input) Quadrilateral
* @param rectangle (Output) Minimum area rectangle
*/
public static void bounding( List<Point2D_I32> points , Rectangle2D_I32 rectangle ) {
rectangle.x0 = Integer.MAX_VALUE;
rectangle.y0 = Integer.MAX_VALUE;
rectangle.x1 = Integer.MIN_VALUE;
rectangle.y1 = Integer.MIN_VALUE;
for( int i = 0; i < points.size(); i++ ) {
Point2D_I32 p = points.get(i);
if( p.x < rectangle.x0 )
rectangle.x0 = p.x;
if( p.x > rectangle.x1 )
rectangle.x1 = p.x;
if( p.y < rectangle.y0 )
rectangle.y0 = p.y;
if( p.y > rectangle.y1 )
rectangle.y1 = p.y;
}
rectangle.x1++;
rectangle.y1++;
}
/**
* Finds the minimum area bounding rectangle which is aligned to the x and y axis around the polygon.
* Note (x0,y0) is inclusive and (x1,y1) is exclusive.
*
* @param quad (Input) Quadrilateral
* @param rectangle (Output) Minimum area rectangle
*/
public static void bounding( Polygon2D_I32 quad , Rectangle2D_I32 rectangle ) {
UtilPolygons2D_I32.bounding(quad.vertexes.toList(),rectangle);
}
/**
* Returns true if the polygon is ordered in a counter-clockwise order. This is done by summing up the interior
* angles.
*
* @param polygon List of ordered points which define a polygon
* @return true if CCW and false if CW
*/
public static boolean isCCW( List<Point2D_I32> polygon ) {
final int N = polygon.size();
int sign = 0;
for (int i = 0; i < N; i++) {
int j = (i+1)%N;
int k = (i+2)%N;
Point2D_I32 a = polygon.get(i);
Point2D_I32 b = polygon.get(j);
Point2D_I32 c = polygon.get(k);
int dx0 = a.x-b.x;
int dy0 = a.y-b.y;
int dx1 = c.x-b.x;
int dy1 = c.y-b.y;
int z = dx0 * dy1 - dy0 * dx1;
if( z > 0 )
sign++;
else
sign--;
}
return sign < 0;
}
}