9

こんにちは、私はプログラミングにかなり慣れていないので、Java で、新しい三角形のポイントが y 値の通常の位置からずれているコーナー間の大きな三角形の中点から再帰的な三角形を作成する関数を作成しようとしています。視覚化については、下の写真を参照してください。

視覚化 - 画像 1

視覚化 - 画像 2

最初の図は、再帰アルゴリズムの進行を偏差なし (0,1,2 の順序) で示し、2 番目の図は (順序 0,1) で示しています。

最初の 2、3 の注文に必要なものだけを作成する作業コードを作成することができましたが、注文 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. まず、3 つの頂点 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

再帰のさまざまなパスで、頂点の中点を何度も計算します。ランダムに変更しない限り、すべてのパスで同じ中間点が得られるため、問題はありません。しかし、もちろん、中間点をランダムに変更すると、2 つの異なる再帰パスで 2 つの異なる中間点で終了します。

三角形の 3 つの角を渡すだけでなく、各頂点の変更された中点も渡すように、アルゴリズムを変更できます。または、それらを別のリストやマップなどに保持し、一度だけ計算し、それ以外は調べます。

于 2012-11-06T14:14:21.350 に答える