Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Computing area of a polygon in Java

Tags:

java

I have a class called SimplePolygon that creates a polygon with coordinates provided by the user. I am trying to define a method to compute the area of the polygon. It's an assignment and course instructor wants us to use the following formula to compute the area.

Formula for polygon area

I can use either formula. I chose the right one.

My code gives me the wrong area. I don't know what's wrong.

public class SimplePolygon implements Polygon {

  protected int n; // number of vertices of the polygon
  protected Point2D.Double[] vertices; // vertices[0..n-1] around the polygon

  public double area() throws NonSimplePolygonException {
    try 
    {
        if(isSimple()==false)
            throw new NonSimplePolygonException();
        else
        {
            double sum = 0;
            for(int i = 0; i < vertices.length - 1; i++)
                if(i == 0)
                    sum += vertices[i].x * (vertices[i+1].y - vertices[vertices.length - 1].y);
                else
                    sum += vertices[i].x * (vertices[i+1].y - vertices[i-1].y);

            double area = 0.5 * Math.abs(sum);
            return area;
        }
    }

    catch(NonSimplePolygonException e)
    {
        System.out.println("The Polygon is not simple.");
    }

    return 0.0;

}

The following is a tester code. The polygon is a rectangle with area 2, but the output is 2.5

    Point2D.Double a = new Point2D.Double(1,1);
    Point2D.Double b = new Point2D.Double(3,1);
    Point2D.Double c = new Point2D.Double(3,2);
    Point2D.Double d = new Point2D.Double(1,2);

    SimplePolygon poly = new SimplePolygon(4);
    poly.vertices[0] = a;
    poly.vertices[1] = b;
    poly.vertices[2] = c;
    poly.vertices[3] = d;

    System.out.println(poly.area());
like image 887
Out Of Bounds Avatar asked May 14 '26 08:05

Out Of Bounds


1 Answers

Now that you've fixed the trivial boundary case, you're missing another boundary and your loop is wrong. Corrected code with debug:

 public double area()
  {
    double sum = 0;
    for (int i = 0; i < vertices.length ; i++)
    {
      if (i == 0)
      {
        System.out.println(vertices[i].x + "x" + (vertices[i + 1].y + "-" + vertices[vertices.length - 1].y));
        sum += vertices[i].x * (vertices[i + 1].y - vertices[vertices.length - 1].y);
      }
      else if (i == vertices.length - 1)
      {
        System.out.println(vertices[i].x + "x" + (vertices[0].y + "-" + vertices[i - 1].y));
        sum += vertices[i].x * (vertices[0].y - vertices[i - 1].y);
      }
      else
      {
        System.out.println(vertices[i].x + "x" + (vertices[i + 1].y + "-" + vertices[i - 1].y));
        sum += vertices[i].x * (vertices[i + 1].y - vertices[i - 1].y);
      }
    }

    double area = 0.5 * Math.abs(sum);
    return area;

  }
like image 66
Evan Knowles Avatar answered May 16 '26 20:05

Evan Knowles



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!