2011-12-09 102 views
0

我正在做一個遞歸Sierpinski三角形的程序,不知道如何更改數組xm[]ym[]中的點以執行此操作。更具體地說,當我運行這個程序時,只繪製了一個帶有一個藍色內三角形的輪廓三角形。任何幫助將不勝感激!遞歸Sierpinski三角形不遞歸

public class recursiveSierpinski { 
    public static void draw(int n, double x0, double y0, double x1, 
     double y1, double x2, double y2) { 
     // if reach base case, method return 
     if (n==0) return; 
     // define array xm, ym to store x and y values of midpoints 
     double [] xm = new double[3]; 
     double [] ym = new double[3]; 

     // assign midpoints’ values to xm and ym 
     xm[0]= (x0+x1)/2; 
     xm[1]= (x1+x2)/2; 
     xm[2]= (x2+x0)/2; 
     ym[0]= (y0+y1)/2; 
     ym[1]= (y1+y2)/2; 
     ym[2]= (y2+y0)/2; 

     StdDraw.setPenColor(StdDraw.BLUE); 
     StdDraw.filledPolygon(xm, ym); //this makes triangle 
     xm[0]=xm[0]/2.0; 
     ym[0]=ym[0]/2.0; 
     xm[1]=xm[1]/2.0; 
     ym[1]=ym[1]/2.0; 
     xm[2]=xm[2]/2.0; 
     ym[2]=ym[2]/2.0; 

     draw(n,xm[0],ym[0],xm[1],ym[1],xm[2],ym[2]); 
     draw(n,xm[1],ym[1],xm[2],ym[2],xm[0],ym[0]); 
     draw(n,xm[2],ym[2],xm[0],ym[0],xm[1],ym[1]); 

     // recursively draw the sub triangles (?) 


    } 
    public static void main(String[] args) { 
    // N levels of recursion 
    int N = Integer.parseInt(args[0]); 
    // outline the triangle 
    double t = Math.sqrt(3.0)/2.0; 
    StdDraw.line(0.0, 0.0, 1.0, 0.0); 
    StdDraw.line(1.0, 0.0, 0.5, t); 
    StdDraw.line(0.5, t, 0.0, 0.0); 
    draw(N, 0.0, 0.0, 0.5, t, 1.0, 0.0); 
    } 
} 
+1

這功課嗎?如果是這樣,請添加「家庭作業」標籤。 – home

+1

學校項目? –

+0

是的,這是一個學校項目,對不起 – bitva

回答

1

試試這個:

public class recursiveSierpinski { 
    public static void draw(int n, double x0, double y0, double x1, 
     double y1, double x2, double y2) { 
     // if reach base case, method return 
     if (n==0) return; 
     // define array xm, ym to store x and y values of midpoints 
     double [] xm = new double[3]; 
     double [] ym = new double[3]; 

     // assign midpoints’ values to xm and ym 
     xm[0]= (x0+x1)/2; 
     xm[1]= (x1+x2)/2; 
     xm[2]= (x2+x0)/2; 
     ym[0]= (y0+y1)/2; 
     ym[1]= (y1+y2)/2; 
     ym[2]= (y2+y0)/2; 

     StdDraw.filledPolygon(xm, ym); //this makes triangle 

     draw(n-1,xm[0],ym[0],xm[1],ym[1],x1,y1); 
     draw(n-1,xm[1],ym[1],xm[2],ym[2],x2,y2); 
     draw(n-1,xm[2],ym[2],xm[0],ym[0],x0,y0); 


    } 
    public static void main(String[] args) { 
    // N levels of recursion 
    int N = Integer.parseInt(args[0]); 
    // outline the triangle 

    double t = Math.sqrt(3.0)/2.0; 


    StdDraw.setPenColor(StdDraw.BLACK); 
    // fill arrays initially to draw black solid TRIANGLE xm, ym = 0.0, 0.0, 0.5, t, 1.0, 0.0 
    StdDraw.filledPolygon(xm, ym); 

    StdDraw.setPenColor(StdDraw.WHITE); 
    draw(N, 0.0, 0.0, 0.5, t, 1.0, 0.0); 
    } 
} 
+0

謝謝!這有助於很多 – bitva

0

你不應該有任何更多的更改。假設你的參數表示三角形的點,在你的filledPolygon調用之後,你已經計算了你的點數。

對於三角形ABC,您已經找到AB,BC,AC的中點。因此,您可以遞歸調用三角形A-AB-AC,三角形AB-B-BC和三角形BC-C-AC上的Sierpinski。

根據您的代碼,您將在filledPolygon()調用後刪除對xm和ym的更改,並調用draw。還要注意,你想要n-1,否則你會無限遞歸。

draw(n-1,x0,y0,xm[0],ym[0],xm[2],ym[2]); 
draw(n-1,xm[0],ym[0],x1,y1,xm[1],ym[1]); 
draw(n-1,xm[1],ym[1],x2,y2,xm[0],ym[0]); 
0

關於托馬斯的漂亮answer

它實際上應該是

draw(n-1,x0,y0,xm[0],ym[0],xm[2],ym[2]); 
draw(n-1,xm[0],ym[0],x1,y1,xm[1],ym[1]); 
draw(n-1,xm[1],ym[1],xm[2],ym[2],x2,y2); 

因此,根據我的最後一行應該是不同的。