我正在研究2D图形最佳拟合项目。我当时使用C ++进行编程,后来改用Java,因此我知道该算法有效。但是我遇到了超出循环范围或更可能添加到ArrayList的范围之外的ArrayList元素的问题。
我可以在此范围内找到所需的元素,但是在此范围之外,某些元素丢失了。我知道这是无关紧要的,可能发生了超出我注意力范围的事情。
三角类:
public class Triangle implements Shape, Cloneable
{
private double length; // size of equaliteral triangle's each edge.
private double x,y;
private boolean rotate; // Flag for rotate by 90 degress around pos(x,y)
private boolean fill; // Flag for fill
private static double total_area = 0;
private static double total_perim = 0;
private int[] xPoints;
private int[] yPoints;
.
...
}
定义:
Triangle t2 = (Triangle)small;
Triangle t = (Triangle)t2.clone();
List<Shape> shape = new ArrayList<Shape>();
在下面的代码中,我将其添加到列表中后立即将其绘制。在这种情况下,方法draw()无关紧要,它仅使用x和y之类的字段。
代码1:
// (a,width-a*sqrt(3)) init for fill inside without rotating
for(y = r1.getHeight()-tri_height;y>=0;y-=tri_height)
{
x=t.getLength()/2.0;
while(x+t.getLength()/2.0<=r1.getWidth())
{
t.setPosition(x+_x,y+_y);
shape.add((Triangle)t.clone());
shape.get(size).draw(g); // check this line.
++size;
x+=t.getLength();
}
}
在同一段代码中,我仅在插入完成后绘制/打印它们。
代码2:
// (a,width-a*sqrt(3)) init for fill inside without rotating
for(y = r1.getHeight()-tri_height;y>=0;y-=tri_height)
{
x=t.getLength()/2.0;
while(x+t.getLength()/2.0<=r1.getWidth())
{
t.setPosition(x+_x,y+_y);
shape.add((Triangle)t.clone());
x+=t.getLength();
}
}
for(Shape s:shape)
s.draw(g);
clone()方法:
@Override
public Object clone() throws CloneNotSupportedException
{
return super.clone();
}
我只使用draw()方法来更好地显示差异。问题在于元素不在范围之内。或者我没有正确添加它们。它向我显示了我添加的最后一个元素,而不是我添加的每个元素。在这种情况下我想念什么?
答案 0 :(得分:2)
看来您的问题出在Triangle.clone()
方法中。您在Triangle
中有引用,例如int[] xPoints
或int[] yPoints
。
Object.clone()
的默认实现仅适用于简单类型,而不适用于引用。
Triangle t = (Triangle)t2.clone();
t.xPoints == t2.xPoints; // this is same array (not a copy)
您所有的矩形都绘制在同一位置。
请勿使用clone()
方法。一般来说,它已经过时了。您必须像C++ copy constructor
一样创建并手动创建对象的副本。
public class Triangle implements Shape {
private static double total_area = 0;
private static double total_perim = 0;
private double length;
private double x,y;
private boolean rotate;
private boolean fill;
private int[] xPoints;
private int[] yPoints;
public Triangle(Triangle triangle) {
this.length = triangle.length;
this.x = triangle.x;
this.y = triangle.y;
this.rotate = triangle.rotate;
this.fill = triangle.fill;
this.xPoints = xPoints != null ? Arrays.copyOf(xPoints, xPoints.length) : null;
this.yPoints = yPoints != null ? Arrays.copyOf(yPoints, yPoints.length) : null;
}
}
PS
int[] xPoints
:xPoints
-不是数组,而是对int
数组的引用。
int[] xPointsCopy = xPoints
:xPointsCopy
-这是对int
的相同数组的另一种引用。