<iframe src="https://editor.p5js.org/juliuslsk/full/Mih5chBin" width="550" height="600"></iframe> # Iterated Function System (IFS) $ \text{葉柄:} f_1\left( \begin{bmatrix} x \\ y \end{bmatrix} \right) = \begin{bmatrix} 0 & 0 \\ 0 & 0.16 \end{bmatrix} \begin{bmatrix} x' \\ y' \end{bmatrix} + \begin{bmatrix} 0 \\ 0 \end{bmatrix} $ $ \text{葉上部:} f_2\left( \begin{bmatrix} x \\ y \end{bmatrix} \right) = \begin{bmatrix} 0.85 & 0.04 \\ -0.04 & 0.85 \end{bmatrix} \begin{bmatrix} x' \\ y' \end{bmatrix} + \begin{bmatrix} 0 \\ 1.6 \end{bmatrix} $ $ \text{左小葉:} f_3\left( \begin{bmatrix} x \\ y \end{bmatrix} \right) = \begin{bmatrix} 0.20 & -0.26 \\ 0.23 & 0.22 \end{bmatrix} \begin{bmatrix} x' \\ y' \end{bmatrix} + \begin{bmatrix} 0 \\ 1.6 \end{bmatrix} $ $ \text{右小葉:} f_4\left( \begin{bmatrix} x \\ y \end{bmatrix} \right) = \begin{bmatrix} -0.15 & 0.28 \\ 0.26 & 0.24 \end{bmatrix} \begin{bmatrix} x' \\ y' \end{bmatrix} + \begin{bmatrix} 0 \\ 0.44 \end{bmatrix} $ 以葉柄爲例,其矩陣方程式可理解為: $ \begin{aligned} x &= 0x' &+& 0y' &+& 0 \\ y &= 0x' &+& 0.16y' &+& 0 \end{aligned} $ # p5.js 程式碼 ```Javascript // 葉梗 stem function f1(startPoint) { ret = createVector(0, 0); ret.x = 0; ret.y = 0.16 * startPoint.y; return ret; } // 上部 upper part function f2(startPoint) { ret = createVector(0, 0); ret.x = 0.85 * startPoint.x + 0.03 * startPoint.y; ret.y = -0.04 * startPoint.x + 0.85 * startPoint.y + 1.6; return ret; } // 左小葉 left part function f3(startPoint) { ret = createVector(0, 0); ret.x = 0.2 * startPoint.x - 0.4 * startPoint.y; ret.y = 0.15 * startPoint.x + 0.22 * startPoint.y + 1.6; return ret; } // 右小葉 right part function f4(startPoint) { ret = createVector(0, 0); ret.x = -0.15 * startPoint.x + 0.4 * startPoint.y; ret.y = 0.15 * startPoint.x + 0.24 * startPoint.y + 0.44; return ret; } ``` 通过调用random(1, 101)生成一个1到100的随机整数,这个随机数决定了选择哪个函数。 * 如果rnd是1到1之间的数(即1),将选择第一个函数f1(只处理y坐标,用于生成植物的茎部)。 * 如果rnd是2到86之间的数,将选择第二个函数f2(处理x和y坐标,生成植物的上部)。 * 如果rnd是87到93之间的数,将选择第三个函数f3(生成植物的左小叶)。 * 如果rnd是94到100之间的数,将选择第四个函数f4(生成植物的右小叶)。 这种方法确保了函数的选择不是平均分布的,而是依据设定的概率,从而使生成的图形具有不同的视觉重点和结构。例如,f2被选中的机会最大(占总概率的85%),因为它生成的是植物的主体部分,而其他函数则辅助生成较小的叶子或特定的细节。 这种概率设计使得生成的图形更加丰富和复杂。 ```javascript function getNextPoint(currentPoint) { choices = [{ probabilityMargin: 1, // 1%概率 func: f1 }, { probabilityMargin: 86, // 85%概率 func: f2 }, { probabilityMargin: 93, // 7%概率 func: f3 }, { probabilityMargin: 100, // 7% 概率 func: f4 } ]; let chosenFunction; let rnd = floor(random(1, 101)); for (let i = 0; i < choices.length; i++) { if (rnd <= choices[i].probabilityMargin) { chosenFunction = choices[i].func; break; } } return chosenFunction(currentPoint); } ``` Reference Tutorial:https://www.algorithm-archive.org/contents/barnsley/barnsley.html 可以用GeoGebra來視覺化linear transformation:https://www.geogebra.org/m/YCZa8TAH