user3308067
user3308067

Reputation: 59

The type of the expression must be an array type but it is resolved to ArrayList<Point2D.Double>

I am trying to figure out the proper way to call arrays from the area method, which are then supposed to calculate the area of the points given. Not sure what the proper way to select the specific x and y coordinates from each array is.

MyPolygon class

  import java.util.ArrayList;
import java.awt.geom.Point2D;
import java.awt.geom.Point2D.Double;

/**
 * A class that represents a geometric polygon. Methods are provided for adding
 * a point to the polygon and for calculating the perimeter and area of the
 * polygon.
 */
class MyPolygon {

    // list of the points of the polygon
    private ArrayList<Point2D.Double> points;

    /**
     * Constructs a polygon with no points in it.
     */
    public MyPolygon() {
        points = new ArrayList<Point2D.Double>();
    }

    /**
     * Adds a point to the end of the list of points in the polygon.
     * 
     * @param x
     *            The x coordinate of the point.
     * @param y
     *            The y coordinate of the point.
     */
    public void add(double x, double y) {
        points.add(new Point2D.Double(x, y));
    }

    /**
     * Calculates and returns the perimeter of the polygon.
     * 
     * @return 0.0 if < 2 points in polygon, otherwise returns the sum of the
     *         lengths of the line segments.
     */
    public double perimeter() {

        if (points.size() < 2) {
            return 0.0;
        }

        int i = 0;
        double d = 0;
        double total = points.get(0).distance(points.get(points.size() - 1));

        while (i < points.size() - 1) {
            Point2D.Double point1 = points.get(i);
            // double x = point1.x;
            // double y = point1.y;
            Point2D.Double point2 = points.get(i + 1);
            // double x1 = point2.x;
            // double y1 = point2.y;

            d = point1.distance(point2);
            // d = Math.sqrt(Math.pow(x1 - x,2) + Math.pow(y1 - y, 2));

            total = total + d;
            i++;

        }
        return total;

    }

    /**
     * Calculates and returns the area of the polygon.
     * 
     * @return 0.0 if < 3 points in the polygon, otherwise returns the area of
     *         the polygon.
     */
    public double area() {

        int i = 0;
        double a = 0;
        double total = 0;
        total = total + a;

        if (points.size() < 3) {
            return 0.0;
        }

        for (int m = 0; m < points.size(); m++) {

            total = total + (points[m].x() * points[m + 1].y()) - (points[m].y() * points[m + 1].x());
        }
        return 0.5 * total;
    }

}

Tester Class

class PolygonTester {

    public static void main(String args[]) {
        MyPolygon poly = new MyPolygon();
        poly.add(1.0,1.0);
        poly.add(3.0,1.0);
        poly.add(1.0,3.0);
        System.out.println(poly.perimeter());
        System.out.println(poly.area());
    }

}

Upvotes: 0

Views: 880

Answers (4)

McLovin
McLovin

Reputation: 3674

ArrayLists are not arrays. They are objects that are indexed with the get(int) method.
Wherever you have points[m], or something similar, replace it with points.get(m). The line would then become:

total = total + (points.get(m).x() * points.get(m + 1).y()) - (points.get(m).y() * points.get(m + 1).x());

That should clear up that issue, but you will still probably get an IndexOutOfBoundsException on the last iteration of the loop, because you will be trying to index m + 1 when m is the last index. You should change your code depending on how you want it to handle the last element.

Upvotes: 0

tbodt
tbodt

Reputation: 16997

The solution is quite simple, and is given away by your title (which I assume to be a compiler error.)

You are treating points as an array, which it is not. You access elements of an ArrayList slightly differently: you use points.get(m) instead of points[m]. If you make that change in area, it will work.

Upvotes: 0

jervine10
jervine10

Reputation: 3077

You're going to run out of bounds on the list. Your for loop continues while m < size(). However you access m+1 in your calculation. So if the list contains 5 elements and m = 4, (4 < 5) so keep looping, you will then access m + 1 which is 5. You don't have an index of 5 since these lists are 0 based.

Also the code is probably not compiling because you're using array syntax to access a list. You should say points.get(m)

Upvotes: 0

exception1
exception1

Reputation: 1249

Your headline is actually already the solution. You use points[m] which is array notation. But points ist not an array. It is a list. Use points.get(int i) instead, as you did in perimeter().

Upvotes: 1

Related Questions