如何有效地找到任何给定的规则或不规则多边形的周长?
我有一个包含多边形点的列表(至少它包含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;
}
答案 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));
}