2012-11-05 13 views
9

こんにちは私はかなりプログラミングが新しく、新しい三角形の点が通常の位置からずれている角の間の大きな三角形の中間点から再帰的な三角形を作成する関数を作成しようとしていますy値。ビジュアライゼーションについては下の図を参照してください。偏差のあるJava再帰三角形

Visualization - Image 1

Visualization - Image 2

最初の画像は、任意の偏差(順序0,1,2)なしに再帰アルゴリズムの進行を示し、第二の画像は、(順序0,1)でそれを示しています。

私は最初の2つの注文のために必要なものを作成するコードを作成しましたが、2番目と2番目の注文に達すると、小さな三角形が同じ中間点を使用しない問題にぶつかりますしたがって、以下の図のようになります。

work in progress

だから私は、三角形のそれぞれについて、正しい中間点を保存し、呼び出す方法で助けが必要。私は中点の計算を制御し、それらを保存する新しいクラスを実装することを考えていましたが、私はこれに助けが必要だと言いました。以下

lineBetweenためのポイントクラス格納AXとY値は、選択された点の間の線を作成し、事前に

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

エッジを分割し、共有頂点などを参照する三角形を持つことができるように、「エッジ」クラスと「頂点」クラスを持ちます。 – Torious

+0

なぜ乱数が必要ですか? devの目的は何ですか?元の投稿を編集してください。ありがとう – durron597

+0

'getMidpoint(Point a、Point b、double deviation)'メソッド(または同様のもの)を作成することをお勧めします。また、あなたの偏差はなぜy方向にしかないのですか?私は確かに分かりませんが、あなたの問題は、次のレベルに進む際にポイントを一貫した順序で保持しないことが原因であると思われます。 –

答えて

0

midpoi任意の頂点のntsを再帰の異なるパスで何度も繰り返します。あなたが無作為にそれらを変更しない限り、あなたはすべてのパスのために同じ中点を得るので問題はありません。 もちろん、中点をランダムに変更すると、2つの異なる中点が2つの異なる再帰パスで終了します。

三角形の3隅を通過するだけでなく、各頂点の修正された中間点を渡すようにアルゴリズムを変更できます。または、それらを別のリストまたはマップまたは何かに保管し、それらを一度だけ計算し、それ以外の場合はそれらを検索します。

1

3点(頂点)で三角形を定義できます。したがって、頂点a、b、およびcは三角形を形成します。 ab、acおよびbcの組み合わせがエッジになります。だから、このアルゴリズムは行く:3つの頂点a、b、cの

    1. 最初のスタートは、3辺のP1、P2とP3の中点を取得し、4つの小さな三角形のための頂点の4セットを取得します。
    2. 深さに達するまで、4つの三角形のサブ三角形を再帰的に見つけます(つまり、(a、p1、p2)、(b、p1、p3)、(c1、p2、p3) 。

    ので、おおよその目安として、コードを使用すると、データ構造に関連する三角形を格納する必要が

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

    を行きます。