任意多边形的周长-java

任意多边形的周长-java,java,algorithm,geometry,Java,Algorithm,Geometry,如何有效地找到任意给定正多边形或不规则多边形的周长 我有一个包含多边形点的列表(至少包含3个点),因此多边形可以是三角形、矩形、五边形、六边形等等 protected List<Point> coordinates = new ArrayList<Point>(); 所以我在寻找任意给定多边形周长的一般公式? 这可能吗 我想在一个抽象多边形类上实现这一点,这个抽象多边形类有子类triangle和rectangle,但我想要一个适用于所有多边形的通用公式 我尝试了以下方法

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

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

protected List<Point> coordinates = new ArrayList<Point>();
所以我在寻找任意给定多边形周长的一般公式? 这可能吗

我想在一个抽象多边形类上实现这一点,这个抽象多边形类有子类triangle和rectangle,但我想要一个适用于所有多边形的通用公式

我尝试了以下方法:

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());
    }
}
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;
}
公共双周界(){
双倍距离=0;
对于(int i=0;ii){
距离+=坐标.get(i).dist(坐标.get(j));
}
}
}
返回距离;
}

如果点从第一个点连接到第二个点,第二个点连接到第三个点,…,最后一个点连接到第一个点,则以下是查找周长的代码

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;
}
公共双周界(){
双倍距离=0;
int len=coordinates.size();
对于(int i=0;i
规则多边形和不规则多边形的计算效率不同

对于正内接多边形,周长为
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));
    }
int len=coordinates.size();
对于(inti=len-1,j=0;j
多边形点按顺序排列。我是说我们知道这条线是从哪一点到哪一点的吗?是的,我们知道。这张单子把要点按顺序排好了。我有点困惑。周长应该是直线长度的总和,对吗?还是我遗漏了什么?是的。。。但是如果我有一个矩形,我有点(不是顺时针的)0->1,1->2,2->3,3->0我怎么能从3变为0?谢谢。哈哈,我一时忘记了java中的%了。哈哈,我太笨了,谢谢,我明白了。你知道我在一次实践考试中也忘了%。专门讨论如何枚举多边形边的整个网页。它指出,如果你先考虑关闭边,你可以省去<代码> %>代码>运算符的需要。