私はScalaに関数を持っていて、JavaScriptにも同じ関数を持っていますが、それが機能的なスタイルではないと思います。
def drawSurroundingTriangles(startx : Double, starty : Double, width : Double) {
var newwidth = width/2;
var newstartx = startx + newwidth / 2;
var newstarty = starty - newwidth;
drawTriangle(newstartx, newstarty, newwidth);
drawTriangle(newstartx - newwidth, starty + newwidth, newwidth);
drawTriangle(newstartx + newwidth, starty + newwidth, newwidth);
if(newwidth < 6)
return;
drawSurroundingTriangles(newstartx, newstarty, newwidth);
drawSurroundingTriangles(newstartx - newwidth, starty + newwidth, newwidth);
drawSurroundingTriangles(newstartx + newwidth, starty + newwidth, newwidth);
}
私の望みは、これを再帰的にするのではなく、反復子にすることです。そうすれば、次の反復を取得し続けることができ、次のレベルが出力されるので、プログラムは最初に外側の三角形を作成し、次に最初の内側の三角形を描画します。それをイテレータにすることで、キーが押されて次の反復が行われるのを待つことができ、おそらく毎回色が変わります。
その後、この関数に到達し、そこでループします。各反復で次のようになります。
- 中央の三角形の両側に1つずつ、合計3つの三角形を描画します
- 前の反復からの3つの三角形の両側に1つずつ、合計9つの三角形を描画します。
- 27個の三角形を描く
..。
アップデート:
すみません、クエスチョンマークを忘れてしまい、見づらいです。
基本的には、再帰関数からオンデマンドで呼び出せる関数に変更して、次の反復を描画してもらいたいと思います。 どうやってやるの?
アップデート2:
私にはうまくいく解決策がありますが、どちらの解決策が良いのか、私のものか、この質問の答えでもあるのかわかりません:
def drawSurroundingTriangles(indexlist : List[(Double, Double, Double)]) : List[(Double, Double, Double)] = {
var mylist = ListBuffer[(Double, Double, Double)]()
indexlist.foreach{
case (startx, starty, width) => { mylist ++ drawSingleTriangle(startx, starty, width) } }
mylist.toList;
}
def drawSingleTriangle(startx : Double, starty : Double, width : Double) : List[(Double, Double, Double)] = {
val newwidth = width/2;
val newstartx = startx + newwidth / 2;
val newstarty = starty - newwidth;
var list = List((newstartx, newstarty, newwidth),
((newstartx - newwidth, starty + newwidth, newwidth)),
(newstartx + newwidth, starty + newwidth, newwidth));
list.foreach{ case (nstartx, nstarty, nwidth) => drawTriangle(nstartx, nstarty, nwidth)}
list;
}