因此,对于这个项目,我希望输入一个包含许多点的数组。 (没有具体的数字)。我对如何处理方法和构造函数感到困惑,因为一些方法需要进行更改,例如获取X或Y值的平均值。我是否以正确的方式接近这个项目?我应该使用点列表的克隆,数组列表还是什么......(注意我只显示了PolygonImpl类的一部分作为示例,它们的功能相似)类点包含:
public class Point {
private double x;
private double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public Point translate(double dx, double dy) {
return new Point(x+dx, y+dy);
}
public double distanceTo(Point p) {
return Math.sqrt((p.x - x)*(p.x -x) + (p.y-y)*(p.y-y));
}
}
public class PolygonImpl implements Polygon {
private double xSum=0;
private double ySum=0;
private ArrayList<Point> points;
private Point[] pList;
private Point a;
PolygonImpl(Point[] pList) {
this.pList = pList.clone();
points = new ArrayList<Point>();
for (int index = 0; index < pList.length; index++) {
points.add(pList[index]);
xSum += pList[index].getX();
ySum += pList[index].getY();
}
}
public Point getVertexAverage() {
double xSum = 0;
ArrayList<Point> vlist = new ArrayList<Point> ();
double ySum = 0;
for (int index = 0; index < vlist.size(); index++) {
xSum = xSum + vlist.get(index).getX();
ySum = ySum + vlist.get(index).getY();
}
return new Point(xSum/getNumSides(), ySum/getNumSides());
}
public int getNumSides() {
return pList.length;
}
public void move(Point c) {
Point newCentroid = new Point(a.getX()+ c.getX(), a.getY() +c.getY());
}
public void scale(double factor) {
ArrayList<Point> points = new ArrayList<Point> ();
for (int index = 0; index < pList.length; index++) {
{ double x = pList[index].getX() *factor;
double y = pList[index].getY() * factor;
Point a = new Point(x,y);
points.add(index,a);
}
}
}
答案 0 :(得分:0)
在这种情况下,我认为你不需要额外的List对象;他们是多余的。 这是使用pList数组的代码。
public class PolygonImpl implements Polygon {
private double xSum=0;
private double ySum=0;
private Point[] pList;
private Point a;
PolygonImpl(Point[] pList) {
this.pList = pList.clone();
for (int index = 0; index < pList.length; index++) {
xSum += pList[index].getX();
ySum += pList[index].getY();
}
}
public Point getVertexAverage() {
double xSum = 0;
double ySum = 0;
for (int index = 0; index < pList.length; index++) {
xSum = xSum + pList[index].getX();
ySum = ySum + pList[index].getY();
}
return new Point(xSum/getNumSides(), ySum/getNumSides());
}
public int getNumSides() {
return pList.length;
}
public void move(Point c) {
Point newCentroid = new Point(a.getX()+ c.getX(), a.getY() +c.getY());
}
public void scale(double factor) {
for (int index = 0; index < pList.length; index++)
{
double x = pList[index].getX() *factor;
double y = pList[index].getY() * factor;
Point a = new Point(x,y);
pList[index] = a;
}
}
答案 1 :(得分:0)
这里至少有三件事需要指出。
第一个是“克隆”和“复制”之间的区别。 .clone是浅拷贝;这意味着如果您更改克隆,您还可以更改原始文件。
第二个是关于你对集合的使用。因为多边形是一个点的集合,所以数组或ArrayList都是合适的,但是没有必要使用麻烦,或者,如果有的话,想一想是否这是一个好点,然后在内联文档为什么重要,否则当你指的是另一个时,它会以某种形式咬你。
第三是范围。您的多边形类具有实例变量(xSum和ySum),这些变量由getVertexAverage中具有相同名称的变量遮挡。它们在getVertexAverage中的使用方式本身是合适的;实例变量仅在你意味着缓存总和时才有用,这会变得更有问题,因为每个更改点的操作都会使实例值无效。
实例值用于存储有关对象的数据(在这种情况下,点是合理的);实例方法用于在给定状态下对该数据进行操作(在本例中为平均值)。
记住这一点,你现在可以理解移动方法是如何完成的:)