2012-11-05 76 views
9

你好,我是相当新的编程,我试图在Java中创建一个函数,从一个更大的三角形创建递归三角形的角点之间的新三角形点偏离正常位置y值。查看下面的图片了解可视化。Java递归三角形与偏差

Visualization - Image 1

Visualization - Image 2

第一图为递归算法的进展而没有任何偏差(顺序0,1,2)和所述第二图像与(顺序0,1)示出了它。

我设法生成了一段代码,它创建了我想要的第一对订单,但是当我们达到2级及以上订单时,遇到小三角形不使用相同中点的问题因此看起来像下面的图片。

work in progress

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

下面是我当前的代码

点类存储斧头和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);    
    } 
} 

感谢

Victor

+1

拥有'Edge'和'Vertex'类,以便您可以拆分边并使三角形引用共享顶点等。 – Torious

+0

为什么需要随机数?开发的目的是什么?请不要在这里回答,编辑您的原始帖子。谢谢 – durron597

+0

我衷心推荐你创建一个'getMidpoint(Point a,Point b,double deviation)'方法(或类似的),这应该有助于简化这一点。另外,为什么你的偏差只在'y'方向?我不确定,但我怀疑你的问题可能是因为在转移到下一个等级时不能保持积分一致。 –

回答

0

你计算midpoi在递归的不同路径中一次又一次的任何顶点的nts。只要你不随意改变它们,你就可以得到每条路径相同的中点,所以没有问题。 但是,当然,如果您随意修改中点,则会在两个不同的递归路径中以两个不同的中点结束。

你可以修改你的算法,不仅可以通过三角形的三个角,还可以修改每个顶点的中点。或者你把它们放在一个单独的列表或地图或其他东西中,只计算一次,否则就查找它们。

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

你有相关的三角形中存储的数据结构。