任何多边形的周长 - java

时间:2017-11-02 14:08:16

标签: java algorithm geometry

如何有效地找到任何给定的规则或不规则多边形的周长?

我有一个包含多边形点的列表(至少它包含3个点)所以多边形开始可以是三角形,矩形,五边形,六边形等等

protected List<Point> coordinates = new ArrayList<Point>();

我的课程点如下:

public class Point {

    private double _x_, _y_;
    public double y;
    public double x;
    public Point() {
        _x_ = 0;
        _y_ = 0;
    }
    public Point(double x, double y) { 
        setX(x); setY(y); 
    }
    public double getX() { return _x_; }
    public double getY() { return _y_; }
    public void setX(double x) { assert x>0; _x_ = x; }
    public void setY(double y) { assert y>0; _y_ = y; }

    public double dist (Point p) { 
        double dx = getX() - p.getX();
        double dy = getY() - p.getY();
        return Math.sqrt(dx*dx + dy*dy); 
    }


    public String toString() {
        return ((int)getX()+" "+(int)getY());
    }
}

所以我正在寻找任何给定多边形周长的通用公式? 这甚至可能吗?

我想在具有子类三角形和矩形的抽象Polygon类上实现它,但我想要所有多边形的通用公式。

我尝试了以下内容:

public double perimeter() {
    double distance = 0;
    for(int i = 0; i < coordinates.size(); i++) {
        for(int j = i+1; j < coordinates.size(); j++) {
            if(j > i) {
                distance += coordinates.get(i).dist(coordinates.get(j));
            }
        }
    }
    return distance;
}

2 个答案:

答案 0 :(得分:1)

如果点从第一点连接到第二点和第二点到第三点,......,从最后一点到第一点,则查找周长的代码。

public double perimeter() {
    double distance = 0;
    int len = coordinates.size();
    for(int i = 0; i < len; i++) {
         distance += coordinates.get(i).dist(coordinates.get((i+1)%len));
    }
    return distance;
}

答案 1 :(得分:0)

对于规则和不规则多边形,有效计算是不同的!

对于常规内接多边形,周长为2nr sin(π/n),计算时间不依赖于n。 (顺便说一句,对于非常大的n,正弦与其参数准相等,并且周长简化为2πr。)

对于不规则多边形,您必须累积连续顶点对之间的欧几里德距离,这需要n平方根评估。

我建议通过两个索引避免昂贵的模运算:

    int len = coordinates.size();
    for(int i = len - 1, j= 0; j < len; i= j, j++) {
         distance += coordinates.get(i).dist(coordinates.get(j));
    }