【问题标题】:recursive Sierpinski triangle not recursive递归谢尔宾斯基三角形不是递归的
【发布时间】:2011-12-09 16:54:37
【问题描述】:

我正在为递归谢尔宾斯基三角形编写程序,但不知道如何更改数组xm[]ym[] 中的点以执行此操作。更具体地说,当我运行这个程序时,只绘制了一个带有一个蓝色内三角形的轮廓三角形。任何帮助将不胜感激!

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);
     }
}

【问题讨论】:

  • 这是作业吗?如果是这样,请添加“作业”标签。
  • 是的,这是一个学校项目,对不起

标签: java recursion


【解决方案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);
     }
}

【讨论】:

    【解决方案2】:

    您不必再更改它们。假设您的参数代表三角形的点,在您的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]);
    

    【讨论】:

      【解决方案3】:

      关于托马斯的好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);
      

      因此根据我的说法,最后一行应该不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-24
        • 2014-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多