Java递归三角形带偏移量

9

你好,我对编程还比较新,我正在尝试用Java创建一个函数,它可以从更大的三角形中心点开始创建递归三角形,其中新三角形的点在y值上偏离了正常位置。请参见下面的图片进行可视化。

Visualization - Image 1

Visualization - Image 2

第一张图片显示了没有任何偏差的递归算法的进展情况(order 0,1,2),而第二张图片显示了它具有(order 0,1)时的情况。

我已经成功编写了一个能够创建我想要的前几个订单的工作代码,但是当我们达到订单2及以上时,我会遇到问题,即较小的三角形不使用相同的中点,因此看起来像下面的图片。

work in progress

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

以下是我的当前代码

point类存储点的x和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);            
    }
}

感谢您的提前帮助。
维克托

1
EdgeVertex 类,因此您可以拆分边缘并使三角形引用共享的顶点等。 - Torious
为什么需要随机数?dev的目的是什么?请不要在此回答,编辑您的原始帖子。谢谢。 - durron597
我衷心建议您创建一个 getMidpoint(Point a, Point b, double deviation) 方法(或类似方法),这应该有助于简化问题。此外,为什么您的偏差只在 y 方向上?我不确定,但我怀疑您的问题可能是由于在传递给下一级时未保持点的一致顺序所致。 - Clockwork-Muse
2个回答

1

你可以通过3个点(顶点)来定义一个三角形。因此,顶点a、b和c将形成一个三角形。组合ab、acbc将成为边缘。所以算法如下:

  1. 首先从三个顶点a、b和c开始
  2. 获取3条边p1、p2和p3的中点,并获取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);
}     

你需要将相关的三角形存储在数据结构中。


0

在递归的不同路径中,您会再次计算任何顶点的中点。只要您不随机更改它们,每条路径都会得到相同的中点,因此没有问题。

但是,如果您通过随机方式修改中点,则在递归的两个不同路径中将得到两个不同的中点。

您可以修改算法,不仅传递三角形的3个角落,还要传递每个顶点的修改后的中点。或者您可以将它们保留在单独的列表或映射中,仅计算一次并在其他情况下查找。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接