有偏差的 Java 递归三角形

标签 java recursion geometry deviation

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

Visualization - Image 1

Visualization - Image 2

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

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

work in progress

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

下面是我当前的代码

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

提前致谢

维克多

最佳答案

您可以通过 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);
}     

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

关于有偏差的 Java 递归三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13242050/

相关文章:

algorithm - 如何检测椭圆是否与圆相交(相撞)

python - 如何在 python 中使用 cv2 中的 hough 圆?

java - JSON/GSON 解析返回某些属性的空值

java - 如何解析包含区域设置的日期字符串

java - 如何使用不同的分辨率调整应用程序的所有控件的大小

recursion - 是什么让数据结构递归?

java - 在java中使用全局变量递归

algorithm - 比质心更好的 "centerpoint"

Java - 如何逐字节读取 .dat 文件

c++ - 递归逃出迷宫