我需要一些基本的帮助。我很迷茫。我正在尝试创建一个分形三角形,这基本上意味着每个三角形创建3个子三角形。
我的课程由两个构造者组成,一个是公共的,一个是私人的。公共构造函数的目的是创建自己,然后创建另外3个孩子'三角形物体。 (三角形的等级数量基于可变深度,因此深度1仅表示一个大三角形,深度2表示1个大三角形和3个子三角形等。)
我想我的大问题是如何递归调用私有构造函数,以便它可以将自己用作父级?
这是我想要创建的动画的链接(只是三角形)https://drive.google.com/file/d/0B_Tq6mYckE93clFZRnVIMHZBZms/view?usp=sharing
另外:_parent.makeTriangle(points [0],points [1])创建一个' ATriangle'并返回它..如果你想知道那是什么。
public FractalTriangle( int depth, ATriangle tri, int height )
{
this(tri,null,depth);
// set up values of instance variables
_depth = 1;
_p2height = height;
_parent = null;
_tri = tri;
////////////////////////////////////////////////
// Set the triangle's color to a value that depends
// on its depth.
//
// Generate the children triangles for this root.
// Make sure your code for this is as clean and
// modular as possible.
/////////////////////////////////////////////////////
if( depth > 1 )
{
trianglelist = new Vector<FractalTriangle>();
Point points[] = tri.getPoints();
FractalTriangle f1 = new FractalTriangle( _parent.makeTriangle( points[0], points[1]), this, depth-1 );
FractalTriangle f2 = new FractalTriangle( _parent.makeTriangle( points[1], points[2]), this, depth-1 );
FractalTriangle f3 = new FractalTriangle( _parent.makeTriangle( points[2], points[0]), this, depth-1 );
trianglelist.add( f1 );
trianglelist.add( f2 );
trianglelist.add( f3 );
}
}
/**
* recursive constructor; it's private, so can only be called from methods
* of this class. It will get called by the public FractalTriangle.
*/
private FractalTriangle ( ATriangle tri, FractalTriangle parent, int depth )
{
_parent = parent;
_depth = depth;
_tri = tri;
///////////////////////////////////////////////////////////
// get parent's height from parent parameter to compute this height
//
// save other parameters in instance variables
//
// recursively create children -- only if recursion depth limit hasn't
// been reached and the minimum height test passes
///////////////////////////////////////////////////////////
if( depth > 1 )
{
trianglelist = new Vector<FractalTriangle>();
Point points[] = tri.getPoints();
FractalTriangle f1 = new FractalTriangle( this.makeTriangle( points[0], points[1]), this, depth-1 );
FractalTriangle f2 = new FractalTriangle( this.makeTriangle( points[1], points[2]), this, depth-1 );
FractalTriangle f3 = new FractalTriangle( this.makeTriangle( points[2], points[0]), this, depth-1 );
trianglelist.add( f1 );
trianglelist.add( f2 );
trianglelist.add( f3 );
}
}
答案 0 :(得分:0)
这将是一个不必要的复杂解决方案。它可以用java中的简单树来解决。
您无法在java中调用私有构造函数。您必须有一个可以调用的静态方法,而无需实例化一个返回该类实例的类。私有构造函数仅在单例设计模式中有用。但这不会解决你的问题。
http://www.oodesign.com/singleton-pattern.html
如果你仍然想要走这条路线就是一个例子。
What is the possible benefit (if any) of allowing recursive constructors?
即使没有私有构造函数,您的代码也将以递归方式工作。但是如果你想使用私有构造函数,这是你可以递归调用私有构造函数的唯一方法。
{
...
FractalTriangle f1 = FractalTriangle.createFractalTriangle( _parent.makeTriangle( points[0], points[1]), this, depth-1 );
...
}
public static FractalTriangle createFractalTriangle(ATriangle tri, FractalTriangle parent, int depth ){
return new FractalTriangle( _parent.makeTriangle( points[0], points[1]), this, depth-1 );
}
创建一个返回类实例的静态方法。
答案 1 :(得分:0)
而不是两个构造函数,为什么不执行以下操作:
public FractalTriangle ( ATriangle tri, FractalTriangle parent, int depth, int height, int numberOfChild )
{
if(null != parent){
_parent = parent;
_p2height = height;
_depth = depth;
}else{
depth =1;
_parent= null;
}
_tri = tri;
...
for(int i=0; i < numberOfChild; i++){
FractalTriangle child = new FractalTriangle(tri, this, 3, 0, 0);
}
}
致电:
FractalTriangle parent = new FractalTriangle(tri, null, 1, 1, 3);