9

您好,我对编程相当陌生,我正在尝试在 Java 中创建一个函数,该函数从角之间的较大三角形中点创建递归三角形,其中新三角形点偏离 y 值中的正常位置。请参阅下面的图片以进行可视化。

可视化 - 图 1

可视化 - 图 2

第一张图显示了没有任何偏差的递归算法的进程(顺序 0,1,2),第二张图显示了(顺序 0,1)。

我已经设法生成了一段工作代码,它为前几个订单创建了我想要的东西,但是当我们达到订单 2 及以上时,我遇到了较小的三角形不使用相同中点的问题,因此看起来像下图。

工作正在进行中

所以我需要一种方法来存储和调用每个三角形的正确中点。我一直在考虑实现一个新的类来控制中点的计算并存储它们等等,但正如我所说我需要帮助。

以下是我当前的代码

点类存储一个点的 ax 和 y 值

lineBetween 在选定点之间创建一条线

void fractalLine(TurtleGraphics turtle, int order, Point ett, Point tva, Point tre, int dev) {


    if(order == 0){
        lineBetween(ett,tva,turtle);
        lineBetween(tva,tre,turtle);
        lineBetween(tre,ett,turtle);
    } else {

            double deltaX = tva.getX() - ett.getX();
            double deltaY = tva.getY() - ett.getY();

            double deltaXtre = tre.getX() - ett.getX();
            double deltaYtre = tre.getY() - ett.getY();

            double deltaXtva = tva.getX() - tre.getX();
            double deltaYtva = tva.getY() - tre.getY();

            Point one;
            Point two;
            Point three;

            double xt = ((deltaX/2))+ett.getX();
            double yt = ((deltaY/2))+ett.getY() +RandomUtilities.randFunc(dev);
            one = new Point(xt,yt);

            xt = (deltaXtre/2)+ett.getX();
            yt = (deltaYtre/2)+ett.getY() +RandomUtilities.randFunc(dev);
            two = new Point(xt,yt);

            xt = ((deltaXtva/2))+tre.getX();
            yt = ((deltaYtva/2))+tre.getY() +RandomUtilities.randFunc(dev);
            three = new Point(xt,yt);

            fractalLine(turtle,order-1,one,tva,three,dev/2);
            fractalLine(turtle,order-1,ett,one,two,dev/2);
            fractalLine(turtle,order-1,two,three,tre,dev/2);
            fractalLine(turtle,order-1,one,two,three,dev/2);            
    }
}

提前致谢

胜利者

4

2 回答 2

1

您可以通过 3 个点(顶点)定义一个三角形。所以顶点 a、b 和 c 将形成一个三角形。ab、acbc的组合将是边。所以算法是这样的:

  1. 首先从三个顶点 a、b 和 c 开始
  2. 获取 3 条边 p1、p2 和 p3 的中点,并获取 4 个较小三角形的 4 组顶点。即 (a,p1,p2),(b,p1,p3),(c,p2,p3) 和 (p1,p2,p3)
  3. 递归找到4个三角形的子三角形,直到达到深度。

所以作为一个粗略的指导,代码去

findTriangles(Vertexes[] triangle, int currentDepth) {
    //Depth is reached.
    if(currentDepth == depth) {
          store(triangle);
          return;
    }
    Vertexes[] first = getFirstTriangle(triangle); 
    Vertexes[] second = getSecondTriangle(triangle);
    Vertexes[] third = getThirdTriangle(triangle);;
    Vertexes[] fourth = getFourthTriangle(triangle)

    findTriangles(first, currentDepth+1);  
    findTriangles(second, currentDepth+1);
    findTriangles(third, currentDepth+1);
    findTriangles(fourth, currentDepth+1);
}     

您必须将相关三角形存储在数据结构中。

于 2012-11-20T11:38:53.613 回答
0

您在递归的不同路径中一次又一次地计算任何顶点的中点。只要您不随意更改它们,您就会为每条路径获得相同的中点,因此没有问题。但是,当然,如果您随机修改中点,您将在两个不同的递归路径中以两个不同的中点结束。

您可以修改您的算法,不仅通过三角形的 3 个角,还通过每个顶点的修改中点。或者您将它们保存在单独的列表或地图或其他东西中,并且只计算一次,然后查找它们。

于 2012-11-06T14:14:21.350 回答