1

我的问题涉及可以使用混沌游戏生成的分形地址空间。这些地址空间只是一个主要形状相对于另一个的简单转换。

在此处输入图像描述

在这里的图像中,您可以看到标有“2”的三角形。三角形“21”、“22”和“23”与三角形 2 相关,因为您必须对其进行变换才能获得这些较小的子三角形。

这就是我想要做的.....给定以下参数:

  • int s:原始形状的边数
  • Int d:我们想要的形状树的深度(在图像中,d=2,因为我们生成了主三角形的 3 个较小的三角形,然后也生成了它们的子三角形)
  • Polygon p:我们打算从中制作孩子的原始形状

...我想采用这些参数并开始使用计数器“i”向下迭代每个深度级别。您可以检查在第 i 层,需要 s^d 形状。这些形状中的每一个都将取决于上面级别中的多边形,所以我如何以某种方式存储它们,以便我可以以一种简单的方式创建许多深度级别,并且还可以使用 for 循环或一些其他有效和简单的方法?我最大的希望是,在每个深度级别,我都可以访问我想在这个级别创建的三角形的父级。我还想稍后引用这些形状,或者通过直接名称,因为这是一个唯一的 ID,或者其他一些简单的方式。

我最初的计划是以某种方式使用每个形状的名称(图像中看到的标签)。我可以以某种方式拥有大量形状,但仅填充索引“1”、“2”、“3”、“11”、“12”、“13”、“21”、“22”等。但这似乎不仅混乱且效率低下,而且看起来很荒谬,因为我必须设法以我可以处理的方式获得 1、2 和 3 的这些排列。一定会有更好的办法!

如果有帮助,我提供了我的源代码:

package chaosaddresses;

import java.util.ArrayList;
//import java.awt.Polygon;

public class AddressManager
{
public Address originalPoly;
public ArrayList<Address>[] array;
public int depth;
public int sides;


public AddressManager(int d, int s, Address a)
{
    depth = d;
    sides = s;
    originalPoly = a;
    initArray();
}

private void initArray()
{
    //loop through each depth and get all needed polygons
    //number of polys at each depth is s^d.
    for (int i=1; i <= depth; i++)
    {
        int numPolys = (int)Math.pow(sides,i);
        int numParentPolys = array[i-1].size();
        ArrayList<Address> thisLevel = new ArrayList<>();

        //iterate parent polys and have each generate their children
        for (int j= 0; j < numParentPolys; j++)
        {
            Address[] babies = array[i-1].get(j).makeChildren();

            //add babies to current level
            for (int k=0; k < babies.length; k++)
            {
                thisLevel.add(babies[k]);
            }
        }
        array[i] = thisLevel;
    }
}


}
4

1 回答 1

0

分形适合递归,因为它们的计算本质上是递归的。组织它的一种方法是让每个级别都包含对下一个级别的实例的引用,为您提供一个级别树,每个级别都递归地创建了它们的子级。


编辑
例如,按照这个顺序:

public class Sierpinski {
   public static int MAX_LEVEL = 6;
   private int level;
   private Point2D[] points = new Point2D[3];
   private Sierpinski[] childTriangles = null;

   private Sierpinski(int level, Point2D[] points) {
      this.level = level;
      this.points = points;

      if (level < MAX_LEVEL) {
         childTriangles = createChildren();
      }
   }

   public int getLevel() {
      return level;
   }

   public Point2D[] getPoints() {
      return points;
   }

   private Sierpinski[] createChildren() {
      // TODO finish method....
   }

   public void draw(Graphics2D g2) {
      // TODO finish method:
      // ....  draw this triangle

      if (childTriangles != null) {
         for (Sierpinski childTriangle : childTriangles) {
            childTriangle.draw(g2);
         }
      }
   }
}
于 2013-11-16T02:03:55.347 回答